如何编写组合多个表的Oracle Sql Query

Posted

技术标签:

【中文标题】如何编写组合多个表的Oracle Sql Query【英文标题】:How to write Oracle Sql Query combining multiple tables 【发布时间】:2021-03-17 02:48:28 【问题描述】:

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

A - cust_id,status,cust_type

B - cust_id,acnt_nmbr,acnt_systm

C - cust_id,email,mod_date

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

我需要编写一个查询结合以上所有表来提取 A.cust_id、B.acnt_nmbr、C.email(As New Email)、C_History(As Old Email)。

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

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

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

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

提前感谢传说。

【问题讨论】:

你试过什么SQL? 我用的是oracle sql developer,数据库是Oracle 12c 【参考方案1】:
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

【讨论】:

感谢 Rama,但上述查询无效。

以上是关于如何编写组合多个表的Oracle Sql Query的主要内容,如果未能解决你的问题,请参考以下文章

如何编写涉及多个选择的 Oracle SQL 查询

我如何编写将一次更新多个表的授权访问的 PLSQL 查询 |SQL Developer|

Oracle数据库中如何查询一个用户A下面所有的表的信息

组合来自 2 个单独的 SQL 表的列数据

SQL语句优化系列二(编写最优的SQL语句)

在 Oracle SQL 中显示表的所有约束的名称