SQLite:具有四个表的完全外连接

标签 sql sqlite join full-outer-join

编辑:可以找到此问题的扩展 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/

相关文章:

java - 从 SQL 查询方法返回泛型类型

c# - 将 Visual Studio 2012 中的数据源从 SQLSRV 更改为 MySQL

sql - 如何聚合SQL中的一列一周?

mysql - SQL 将计数(来自 2 个表)添加到现有选择(来自 3 个表)

SQL 查询 : Iterate over values in table and use them in subquery

PHP SQL 连接

java - 如何查询月初到今天的 SQLite 数据

python - SQLite3/ python : Results differ when selecting from VIEW instead of TABLE

c++ - 我们如何确保缓存以减少 SQLite 数据库的文件系统写入周期

mysql - 提高查询整体性能