SQL合并结果集在唯一列值上

Sco*_*ott 3 sql oracle

我有两个类似的查询,它们都在同一个表上工作,我基本上想要结合他们的结果,使第二个查询提供第一个查询不返回的默认值.我在这里尽可能地简化了这个问题.我正在使用Oracle btw.

该表中包含许多帐户的帐户信息,每个帐户都有多个条目,其中commit_date用于指示何时插入帐户信息.我需要获取当前特定日期的帐户信息.

查询会记录帐户ID和日期.

这是查询:

-- Select the row which was current for the accounts for the given date. (won't return anything for an account which didn't exist for the given date)
SELECT actr.*
FROM Account_Information actr 
WHERE actr.account_id in (30000316, 30000350, 30000351) 
AND actr.commit_date <= to_date( '2010-DEC-30','YYYY-MON-DD ')
AND actr.commit_date = 
(
    SELECT MAX(actrInner.commit_date) 
    FROM Account_Information actrInner 
    WHERE actrInner.account_id = actr.account_id
    AND actrInner.commit_date <= to_date( '2010-DEC-30','YYYY-MON-DD ')
) 
Run Code Online (Sandbox Code Playgroud)

这看起来有点难看,但它为每个帐户返回一行,该行在给定日期是当前的.问题是,如果帐户在给定日期之后才存在,则不会返回任何内容.

为每个帐户选择最早的帐户信息很简单 - 我不需要为此提供日期:

-- Select the earliest row for the accounts.
SELECT actr.*
FROM Account_Information actr 
WHERE actr.account_id in (30000316, 30000350, 30000351) 
AND actr.commit_date = 
(
    SELECT MAX(actrInner .commit_date) 
    FROM Account_Information actrInner 
    WHERE actrInner .account_id = actr.account_id
)  
Run Code Online (Sandbox Code Playgroud)

但我希望以这样的方式合并结果集:

对于每个帐户,如果第一个结果集中有帐户信息 - 请使用该帐户.否则,请使用第二个结果集中的帐户信息.

我已经研究过所有可以使用但没有成功的联接.工会几乎做到了,但他们只会合并为唯一的行.我想根据每行中的帐户ID进行合并.

Sql合并两个结果集 - 我的情况显然比这更复杂

SQL返回一组合并的结果 - 我可能能够适应这种技术?我是一个被迫编写SQL的程序员,我不能很好地遵循这个例子,看看我如何根据我的需要修改它.

ano*_*non 5

执行此操作的标准方法是使用左外连接和合并.也就是说,您的整体查询将如下所示:

SELECT ...
FROM defaultQuery
LEFT OUTER JOIN currentQuery ON ...
Run Code Online (Sandbox Code Playgroud)

如果您执行了操作SELECT *,则每行将对应当前帐户数据加上您的默认值.和我一起到目前为止?

现在,SELECT *对于要返回的每一列,不要使用COALESCE()匹配的列对进行:

SELECT COALESCE(currentQuery.columnA, defaultQuery.columnA) ...
Run Code Online (Sandbox Code Playgroud)

这将选择当前帐户数据(如果存在),否则将选择默认数据.