我希望每个人都在这个临时表的列表中,并包括另一个表中的电子邮件地址;如果没有电子邮件,则显示为空。我也想看看他们各自的语言(如果有的话);如果不是,则为空。
我不断得到更多的人,我认为这是重复的。
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。
我在哪里导致复制?
我建议您需要 - 以某种方式 - 将 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() 的逻辑应用于策略表(即作为子查询)。