如何在同名列上执行JOIN?SQLite无RIGHT/FULL JOIN实现全量合并
SQLite 模拟全连接合并两表数据
需求说明
现有两张表T1和T2,结构如下:
- 共同字段:
ID(主键)、X(由ID生成,ID匹配时X值一致)、Y(同ID下两表值不同) T1额外字段:ZT2额外字段:A
需要查询返回两表所有记录,缺失字段填充NULL,并将两表的Y列分别命名为T1Y和T2Y。
原始表数据
T1表
| ID | X | Y | Z |
|---|---|---|---|
| 1 | X1 | Y1 | Z1 |
| 2 | X2 | Y2 | Z2 |
T2表
| ID | X | Y | A |
|---|---|---|---|
| 2 | X2 | Y3 | A1 |
| 3 | X3 | Y4 | A2 |
正确查询语句
由于SQLite不支持RIGHT JOIN或FULL JOIN,可以通过LEFT JOIN + UNION模拟全连接,语句如下:
SELECT COALESCE(T1.ID, T2.ID) AS ID, COALESCE(T1.X, T2.X) AS X, T1.Y AS T1Y, T2.Y AS T2Y, T1.Z, T2.A FROM T1 LEFT JOIN T2 ON T1.ID = T2.ID UNION SELECT COALESCE(T1.ID, T2.ID) AS ID, COALESCE(T1.X, T2.X) AS X, T1.Y AS T1Y, T2.Y AS T2Y, T1.Z, T2.A FROM T2 LEFT JOIN T1 ON T1.ID = T2.ID WHERE T1.ID IS NULL ORDER BY ID;
语句说明
COALESCE函数:优先取T1的ID和X值,当T1无对应记录时取T2的值,保证ID和X列无NULL(符合X由ID生成的规则)。- 第一部分
LEFT JOIN:获取T1的所有记录,以及T2中ID匹配的记录。 - 第二部分
LEFT JOIN+ 过滤条件:仅获取T2中不存在于T1的记录(通过WHERE T1.ID IS NULL过滤),避免与第一部分重复。 UNION:合并两个查询结果,自动去重重复的ID=2记录。
查询结果
| ID | X | T1Y | T2Y | Z | A |
|---|---|---|---|---|---|
| 1 | X1 | Y1 | NULL | Z1 | NULL |
| 2 | X2 | Y2 | Y3 | Z2 | A1 |
| 3 | X3 | NULL | Y4 | NULL | A2 |
原语句问题分析
你之前的查询仅选择了T1.ID和T2.ID两个字段,未处理合并后的ID列,也未提取X、Y、Z、A等所需字段,导致结果出现双ID列和NULL的ID值,无法满足需求。
内容的提问来源于stack exchange,提问作者JoKing
相关产品推荐
相关产品推荐

