针对3个表的Oracle SQL查询

7ajki6be  于 2023-05-22  发布在  Oracle
关注(0)|答案(1)|浏览(128)

我希望每个人都在这个临时表的名单,并包括电子邮件地址从这个其他表;如果没有电子邮件,则显示null。我也想看看他们各自的语言,如果可用;如果不是,则为空。
我不断得到更多的人,我认为是重复。

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),我将获得85 K。我可以看到在poli表中有多个poli帐户号码,因此该电子邮件可以链接到3个poli帐户号码。我正试图弄清楚如何使它,使它所有的总数为76,815与添加的电子邮件地址和语言。
我在哪里导致了复制?

js4nwp54

js4nwp541#

我建议你需要-以某种方式-将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;

如果一个帐号有多行,而有些行是不需要的,则需要决定使用什么样的列值组合来确定使用哪些列值,哪些不使用。通过“partitioon by”和“order by”中的“over子句”来实现这一点(注:我上面使用的列引用只是一个猜测)。一旦分区/顺序逻辑对您来说是可接受的,那么通过连接条件只选择行号为1的行-因此您可以避免增加临时表的行数。
此外,最好仅在策略表(即,作为子查询),如果这是不需要的行的唯一来源的话。例如,假设策略表中有一个日期列,我们可以使用它来确定哪个策略是最新的。这样,我们从策略表中每个人只得到一行,例如:

WITH
    cte AS (
        SELECT
            poli.id
          , poli.key
          , poli.account_number
          , ROW_NUMBER() OVER (
                PARTITION BY
                    poli.account_number
                ORDER BY
                    poli.created_date DESC -- most recent policy?
            ) AS rn
        FROM
            policytable poli
    )
SELECT
    TEMP.*
  , em.email_addr
  , info.ibe_3103
FROM
    cigna_shared.tempoarytable TEMP
    LEFT JOIN cte ON TEMP.memberid = cte.account_number AND cte.rn = 1
    LEFT JOIN languagetable info ON cte.id = info.id
    LEFT JOIN emailtable em ON cte.KEY = em.KEY

相关问题