首页 > 解决方案 > 如何编写组合多个表的Oracle Sql Query

问题描述

我有 4 个名为 A、B、C、C_History 的表。以下是每个表包含的内容。cust_id 是所有表的通用标识符。

A - cust_id,status,cust_type

B - cust_id、acnt_nmbr、acnt_systm

C - cust_id、电子邮件、mod_date

C_History - cust_id,email,mod_date(与 C 相同,用于插入在 C 中删除/更新的行)。

我需要编写一个查询,结合以上所有表来提取 A.cust_id、B.acnt_nmbr、C.email(作为新电子邮件)、C_History(作为旧电子邮件)。

这里需要注意的是,A 和 B 表将只有一个 cust_id 记录,但 C 和 C_History 可以有多个 cust_id 电子邮件记录。

因此,从 C 表中,我只需要使用 mod_date(TIMESTAMP 数据类型)最新的单个电子邮件,

而且从 C_Hisory 中,我只需要使用 mod_date 的最新电子邮件,但还有一个条件是,无论从 C_History 中挑选的最新电子邮件,都不应与从 C 中挑选的最新电子邮件相同。

请帮助解决这个问题,因为我从 2 天以来一直在努力解决这个问题。

提前感谢传说。

标签: sqloracleoracle12c

解决方案


SELECT A.cust_id
    ,B.acnt_nmbr
    ,C.email
    ,C_History.email
FROM A
    ,B
    ,(
        SELECT cust_id
            ,MAX(email) KEEP (
                DENSE_RANK LAST ORDER BY mod_date
                ) OVER (PARTITION BY cust_id)
        FROM c
        ) c
    ,(
        SELECT cust_id
            ,MAX(email) KEEP (
                DENSE_RANK LAST ORDER BY mod_date
                ) OVER (PARTITION BY cust_id)
        FROM c_history
        ) c_history
WHERE a.cust_id = b.cust_id
    AND c_history.cust_id = a.cust_id
    AND c.cust_id = a.cust_id

推荐阅读