代码之家  ›  专栏  ›  技术社区  ›  AndrejCoding

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

  •  2
  • AndrejCoding  · 技术社区  · 7 年前

    编辑:可以找到此问题的扩展 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 |
    +------+------+------+------+------+------+------+------+-----+-----+
    
    • 同样,这是我的最终目标-lat/lon值在表之间不相互关联:
      • a | b | c |lat | lon |代替
      • a | b | c |表1.lat |表2。纬度|。。。
    • 谢谢你的帮助!
    • 我的当前代码
    -- 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 回复  |  直到 7 年前
        1
  •  3
  •   zarruq    7 年前

    假设示例表包含如下数据

    表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

    推荐文章