Oracle SQL:如何连接两张表并展示所有匹配及不匹配结果?
如何实现包含所有匹配与不匹配行的全外连接并补全空值?
你需要的是同时保留两张表中所有匹配和不匹配的行,并且将缺失的数量字段填充为0——这其实可以通过**全外连接(FULL OUTER JOIN)**结合空值处理实现,或者用兼容性更强的UNION生成全量组合后再左连接,我给你两种适配不同场景的方案:
方案一:兼容性极强的UNION+左连接法(适配所有SQL数据库)
有些数据库(比如MySQL)不支持FULL OUTER JOIN,这种方法就非常适用:
首先我们需要先获取所有出现过的Account + Security组合(不管是在持仓表还是交易表中),然后基于这个全量组合分别左连接两张表,最后用COALESCE把空值替换为0:
WITH All_Combinations AS ( -- 收集所有唯一的账号+证券组合 SELECT Account, Security FROM POSITION_TABLE UNION SELECT Account, Security FROM TRADE_TABLE ) SELECT ac.Account, ac.Security, COALESCE(p.Pos_Quantity, 0) AS Pos_Quantity, COALESCE(t.Trade_Quantity, 0) AS Trade_Quantity FROM All_Combinations ac -- 左连接持仓表,匹配不到的话Pos_Quantity会是NULL,用COALESCE转成0 LEFT JOIN POSITION_TABLE p ON ac.Account = p.Account AND ac.Security = p.Security -- 左连接交易表,同理处理Trade_Quantity LEFT JOIN TRADE_TABLE t ON ac.Account = t.Account AND ac.Security = t.Security ORDER BY ac.Account, ac.Security;
方案二:简洁的FULL OUTER JOIN法(支持该语法的数据库适用)
如果你的数据库支持FULL OUTER JOIN(比如PostgreSQL、SQL Server、Oracle等),可以直接用全外连接,然后处理空值:
SELECT -- 用COALESCE确保账号和证券字段不会出现NULL COALESCE(p.Account, t.Account) AS Account, COALESCE(p.Security, t.Security) AS Security, COALESCE(p.Pos_Quantity, 0) AS Pos_Quantity, COALESCE(t.Trade_Quantity, 0) AS Trade_Quantity FROM POSITION_TABLE p FULL OUTER JOIN TRADE_TABLE t ON p.Account = t.Account AND p.Security = t.Security ORDER BY Account, Security;
这两种方法都能得到你想要的预期输出:匹配的行合并显示,不匹配的行单独展示且缺失的数量字段填充为0。
内容的提问来源于stack exchange,提问作者Radek
相关产品推荐
相关产品推荐

