SQLite多表合并求助:无共同Time值时合并为单表并排序
解决SQLite多表堆叠合并问题(非JOIN方式)
嘿,我完全懂你的困扰——你之前试的JOIN系列方法都是用来基于共同值关联行的,但你的场景是要把三个表的行全部保留,同时补全其他表没有的列为NULL,这时候应该用UNION ALL而不是JOIN!
为什么JOIN不适用?
因为你的三个表time值完全随机且互不重复:
INNER JOIN会因为没有匹配的time值返回空结果;LEFT/RIGHT JOIN只能保留其中一个表的所有行,另外两个表只有匹配到的行才会保留,不符合你要“行数为三个表之和”的需求。
正确的SQL语句
我们需要让每个表都输出包含所有目标列的行,自己没有的列用NULL填充,然后用UNION ALL合并所有行,最后按time的数字大小排序:
SELECT time, "Column 1" AS column1, NULL AS column2, NULL AS column3 FROM "Table 1" UNION ALL SELECT time, NULL AS column1, "Column 2" AS column2, NULL AS column3 FROM "Table 2" UNION ALL SELECT time, NULL AS column1, NULL AS column2, "Column 3" AS column3 FROM "Table 3" ORDER BY CAST(time AS INTEGER);
语句解释
- 每个SELECT子句:都生成包含
time、column1、column2、column3的行,当前表有的列填实际值,没有的列用NULL占位; - UNION ALL:把三个结果集的行全部拼接在一起(不会去重,因为你说
time互不重复,比UNION更高效); - ORDER BY CAST(time AS INTEGER):因为
time是数字字符串,直接按字符串排序会出现字典序问题(比如"100012"会排在"12414"前面),转成整数后才能按数字大小正确排序,和你期望的输出顺序一致。
验证你的示例
执行这个语句后,会得到你想要的结果:
| time | column1 | column2 | column3 |
|---|---|---|---|
| 12414 | NULL | Sofa | NULL |
| 12416 | NULL | Chair | NULL |
| 100012 | Blue | NULL | NULL |
| 100015 | Red | NULL | NULL |
| 100018 | Yellow | NULL | NULL |
| 157981 | NULL | NULL | Squirrel |
| 179719 | NULL | NULL | Bear |
额外注意事项
- 确保每个SELECT子句的列数、列类型完全一致(比如
column1是字符串类型,对应的NULL也会被识别为字符串类型,匹配无误); - 如果你的表名或列名包含空格,一定要用双引号
""包裹,避免SQL语法错误。
内容的提问来源于stack exchange,提问作者CJW
相关产品推荐
相关产品推荐

