【问题标题】:SQLite: full outer join with four tablesSQLite:四个表的完全外连接
【发布时间】:2017-12-06 02:46:44
【问题描述】:

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

这些表没有通过任何外键连接。此外,每一行的 lon/lat 值都不同。最佳输出是:

+------+------+------+------+------+------+------+------+-----+-----+
|  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 | .. | table1.lat | table2.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

【问题讨论】:

  • 如果您不想要 user.longitude、university.longitude 等,那么纬度和经度中会有哪些值?他们将从哪里来?
  • @JINESHSHAH 我确实想在我的桌子上显示经度和纬度,但只有一次(参见示例)。我不想在上面有 user.longitude、university.longitude 等。我是否简洁地表达了自己?一个 |乙 | c | .. |纬度 |经度 |而不是 |乙 | c | .. |用户纬度 |大学.纬度 | ...
  • @AndrejCoding:请分享您从中导出样本所需输出的样本数据
  • @zarruq 你什么意思? :) 我自己创建了表格并输入了一些虚拟值来测试代码是否有效。我应该如何/具体分享什么?
  • @AndrejCoding:您只是分享您想要的输出,但它究竟是从哪些数据派生而来的?您的示例 table1、table2、table3 和 table4 没有数据..

标签: sql sqlite join full-outer-join


【解决方案1】:

假设您的示例表具有如下数据

表 1:

a   b   lon lat
---------------
22  33  11  22

表 2:

c   d   lon lat
---------------
1   2   44  45

Table3

e       f       lon lat
-----------------------
NULL    NULL    100 101

Table4

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

【讨论】:

  • 谢谢!!!!但是,如果我不仅有 a 到 h 的列,还有 a 到 z 的列,即 table1、table2、table3 和 table4 中的许多列 -> 这将非常耗时且结构不清楚我不得不在我的sql语句中到处写NULL作为[字母] - >还有另一种方法吗? @zarruq
  • @AndrejCoding:在这种情况下,您可以使用union all,然后使用pivotcolumns 转换为rows :-)
  • 你太棒了!!! :) 最后一个问题:你能帮我在你的演示代码中展示它吗?我从未使用过枢轴... @zarruq
  • @AndrejCoding:为了未来用户的方便,请关闭此问题并根据您的要求添加新问题,参考当前问题:-)。我们也很乐意为您提供帮助。谢谢!
  • 扩展可以在这里找到link
猜你喜欢
  • 2018-05-19
  • 2012-09-27
  • 2015-05-02
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多