如何编写组合多个表的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的主要内容,如果未能解决你的问题,请参考以下文章