如何通过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

