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

如何通过JOIN操作获取两张表的所有AccountID并包含非共有条目?

如何通过JOIN获取两张表中的所有AccountID?

嘿,我来帮你理清楚这个问题!你现在遇到的情况是,用Table B作为左表做LEFT JOIN时,只会保留Table B里存在的AccountID(也就是A3),但你想要的是两张表中所有的AccountID,不管它在哪个表里出现对吧?

问题根源

LEFT JOIN的核心逻辑是完全保留左表的所有行,只匹配右表中符合关联条件的行,不匹配的右表列会显示NULL。你之前用Table B做左表,而B里只有A3这一个AccountID,所以结果自然只有这一行。要获取所有AccountID,你需要用能同时保留两个表所有行的JOIN类型。

解决方案1:使用FULL OUTER JOIN

大部分主流数据库(比如PostgreSQL、SQL Server)支持FULL OUTER JOIN,它会同时保留两个表的所有行:匹配的行合并展示,不匹配的行则在另一方的列位置显示NULL。结合COALESCE函数可以确保AccountID列始终取非NULL的值,避免出现空白:

SELECT 
    COALESCE(a.AccountID, b.AccountID) AS AccountID,
    a.NumberOfAdams,
    b.NumberOfBrowns
FROM TableA a
FULL OUTER JOIN TableB b 
    ON a.AccountID = b.AccountID
ORDER BY AccountID;

执行这个查询后,你就能得到期望的结果:
+-----------+---------------+----------------+
| AccountID | NumberOfAdams | NumberOfBrowns |
+-----------+---------------+----------------+
| A1 | 2 | NULL |
| A2 | 5 | NULL |
| A3 | 10 | 13 |
+-----------+---------------+----------------+

解决方案2:如果数据库不支持FULL OUTER JOIN(比如MySQL)

可以用UNION结合两个LEFT JOIN来实现同样的效果:

-- 先获取Table A的所有行,以及匹配的Table B数据
SELECT 
    a.AccountID,
    a.NumberOfAdams,
    b.NumberOfBrowns
FROM TableA a
LEFT JOIN TableB b 
    ON a.AccountID = b.AccountID

UNION

-- 再获取Table B中不在Table A里的行
SELECT 
    b.AccountID,
    a.NumberOfAdams,
    b.NumberOfBrowns
FROM TableB b
LEFT JOIN TableA a 
    ON a.AccountID = b.AccountID
WHERE a.AccountID IS NULL

ORDER BY AccountID;

UNION会自动去重,确保每个AccountID只出现一次,最终结果和FULL OUTER JOIN完全一致。

内容的提问来源于stack exchange,提问作者blarg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:59:09