You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:27:40