编辑:可以找到此问题的扩展 here
我想用 SQLite 连接四个不同的表,这些表只有两列是共同的。请看下面的例子
+--------+---+-----+-----+
| table1 | | | |
+--------+---+-----+-----+
| a | b | lon | lat |
+--------+---+-----+-----+
| 1 | 2 | 111 | 222 |
+--------+---+-----+-----+
+--------+---+-----+-----+
| table2 | | | |
+--------+---+-----+-----+
| c | d | lon | lat |
+--------+---+-----+-----+
| 3 | 4 | 333 | 444 |
+--------+---+-----+-----+
+--------+---+-----+-----+
| table3 | | | |
+--------+---+-----+-----+
| e | f | lon | lat |
+--------+---+-----+-----+
| 5 | 6 | 555 | 666 |
+--------+---+-----+-----+
+--------+---+-----+-----+
| table4 | | | |
+--------+---+-----+-----+
| g | h | lon | lat |
+--------+---+-----+-----+
| 7 | 8 | 777 | 888 |
+--------+---+-----+-----+
这些表没有通过任何外键连接。此外,每行的经度/纬度值都不同。最佳输出是:
+------+------+------+------+------+------+------+------+-----+-----+
| a | b | c | d | e | f | g | h | lon | lat |
+------+------+------+------+------+------+------+------+-----+-----+
| None | None | 3 | 4 | None | None | None | NOne | 333 | 444 |
| 1 | 2 | None | None | None | None | None | None | 111 | 222 |
| None | None | None | None | 5 | 6 | None | None | 555 | 666 |
| None | None | None | None | None | None | 7 | 8 | 777 | 888 |
+------+------+------+------+------+------+------+------+-----+-----+
- 再说一次,这是我的最终目标 - 纬度/经度值在表之间没有互连:
- 一个 |乙| c | ..|纬度 |长 |代替
- 一个|乙| c | ..|表1.lat |表2.lat | ...
- 感谢您的帮助!
- 我当前的代码
-- First two tables
CREATE VIEW ab AS
SELECT * FROM table1 LEFT JOIN table2 ON ???
UNION ALL
SELECT * FROM table2 LEFT JOIN table1 ON ?? WHERE ?? IS NULL
-- 3rd and 4th table
CREATE VIEW cd AS
SELECT * FROM table3 LEFT JOIN table4 ON ??
UNION ALL
SELECT * FROM table4 LEFT JOIN table3 ON ?? WHERE ?? IS NULL
-- -- JOIN
SELECT * FROM cd LEFT JOIN ab ON ??
UNION ALL
SELECT * FROM cd LEFT JOIN ab ON ?? WHERE ?? IS NULL
最佳答案
假设您的示例表包含如下数据
表1:
a b lon lat
---------------
22 33 11 22
表2:
c d lon lat
---------------
1 2 44 45
表3
e f lon lat
-----------------------
NULL NULL 100 101
表4
g h lon lat
-----------------------
NULL NULL 200 201
如果你想合并记录,可以使用union all
。
select a,b,NULL as c, NULL as d,NULL as e, NULL as f, NULL as g, NULL as h, lon,lat
from table1
union all
select NULL, NULL,c,d,NULL as e, NULL as f, NULL as g, NULL as h, lon,lat
from table2
union all
select NULL, NULL,NULL,NULL,e,f, NULL as g, NULL as h, lon,lat
from table3
union all
select NULL, NULL,NULL,NULL,NULL,NULL,g,h, lon,lat
from table4
结果:
+------+------+------+------+------+------+------+------+-----+-----+
| a | b | c | d | e | f | g | h | lon | lat |
+------+------+------+------+------+------+------+------+-----+-----+
| 22 | 33 | NULL | NULL | NULL | NULL | NULL | NULL | 11 | 22 |
| NULL | NULL | 1 | 2 | NULL | NULL | NULL | NULL | 44 | 45 |
| NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 100 | 101 |
| NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 200 | 201 |
+------+------+------+------+------+------+------+------+-----+-----+
<强> DEMO
关于SQLite:具有四个表的完全外连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47666005/