针对 3 个表的 Oracle SQL 查询

问题描述 投票:0回答:1

我希望每个人都在这个临时表的列表中,并包括另一个表中的电子邮件地址;如果没有电子邮件,则显示为空。我也想看看他们各自的语言(如果有的话);如果不是,则为空。

我不断得到更多的人,我认为这是重复的。

SELECT temp.*,
   a.email_addr,
   a.ibe_3103
FROM cigna_shared.tempoarytable temp
LEFT JOIN (
    SELECT DISTINCT poli.account_number,
        info.language, em.email_address
    FROM policytable poli
    LEFT JOIN languagetable info
    ON poli.id = info.id
    LEFT JOIN emailtable em
    ON poli.KEY = em.KEY
    ) a
ON temp.memberid = a.account_number; 

临时表中的总人数(76,815),我得到了 85k。 可以看到poli表中有多个poli账号,所以email可以关联3个poli账号。我正在想办法通过添加的电子邮件地址和语言使它的总数达到 76,815。

我在哪里导致复制?

sql oracle left-join
1个回答
0
投票

我建议您需要 - 以某种方式 - 将 row_number() 的使用合并到您的子查询中,以下仅为示例:

SELECT TEMP.*
    , a.email_addr
    , a.ibe_3103
FROM cigna_shared.tempoarytable TEMP
LEFT JOIN (
    SELECT poli.account_number
        , info.LANGUAGE
        , em.email_address
        , row_number() OVER (
            PARTITION BY poli.account_number ORDER BY em.email_address
            ) AS rn
    FROM policytable poli
    LEFT JOIN languagetable info ON poli.id = info.id
    LEFT JOIN emailtable em ON poli.KEY = em.KEY
    ) a ON TEMP.memberid = a.account_number
    AND rn = 1;

如果一个帐号有多行,而有些是不需要的,则需要决定使用什么列值组合来确定哪些被使用,哪些不被使用。通过“partition by”和“order by”中的“over clause”来做到这一点(注意:我在上面使用的列引用只是一个猜测)。一旦您可以接受该分区/顺序逻辑,则仅通过连接条件选择行号为 1 的行 - 因此您可以避免乘以临时表的行。

此外,如果这是不需要的行的唯一来源,则最好仅将此基于 row_number() 的逻辑应用于策略表(即作为子查询)。

© www.soinside.com 2019 - 2024. All rights reserved.