与SQLite完全合作

Yad*_*ada 57 sql sqlite join full-outer-join

SQLite只有INNER和LEFT JOIN.

有没有办法与SQLite进行完全外连接?

Mar*_*ers 93

是的,请参阅Wikipedia上的示例.

SELECT employee.*, department.*
FROM   employee 
       LEFT JOIN department 
          ON employee.DepartmentID = department.DepartmentID
UNION ALL
SELECT employee.*, department.*
FROM   department
       LEFT JOIN employee
          ON employee.DepartmentID = department.DepartmentID
WHERE  employee.DepartmentID IS NULL
Run Code Online (Sandbox Code Playgroud)

  • 如果使用UNION ALL,则两个选择中的一个选择排除"内连接"行(例如显示的WHERE条件)至关重要.或者,您可以使用普通UNION并使其重复消除,避免重复"内部联接"行. (10认同)
  • @GrahamBorland:我的回答中的代码来自维基百科.我认为维基百科自我发布以来就已被编辑过.不同之处在于它们使用内连接和两个选择来获取不匹配的记录(每个表一个).我的答案中的查询将内连接和其中一个选择组合成左连接.与(A + B)+(C)相比,它是(A)+(B)+(C). (3认同)

Luk*_*zda 23

从 SQLite 3.39.0 开始原生支持 FULL OUTER JOIN:

2.1. 输入数据的确定(FROM 子句处理)

在此输入图像描述

“FULL JOIN”或“FULL OUTER JOIN”是“LEFT JOIN”和“RIGHT JOIN”的组合。为左侧数据集中与右侧不匹配的行以及右侧数据集中与左侧不匹配的每一行添加额外的输出行。不匹配的列用 NULL 填充。


演示:

CREATE TABLE t1 AS
SELECT 1 AS id, 'A' AS col UNION
SELECT 2 AS id, 'B' AS col;

CREATE TABLE t2 AS
SELECT 1 AS id, 999 AS val UNION
SELECT 3 AS id, 100 AS val;
Run Code Online (Sandbox Code Playgroud)

询问:

SELECT *
FROM t1
FULL JOIN t2
  ON t1.id = t2.id;
Run Code Online (Sandbox Code Playgroud)

db<>小提琴演示


Adi*_*ain 5

在乔纳森·莱夫勒(Jonathan Leffler)评论之后,这是马克·拜尔斯(Mark Byers)的另一种答案:

SELECT * FROM table_name_1 LEFT OUTER JOIN table_name_2 ON id_1 = id_2
UNION
SELECT * FROM table_name_2 LEFT OUTER JOIN table_name_1 ON id_1 = id_2
Run Code Online (Sandbox Code Playgroud)

请参阅此处以获取原始源代码和其他SQLite示例。

  • 我认为WHERE employee.DepartmentID IS NULL是必须的,尽管您不介意获取重复行 (3认同)
  • UNION(_without_ ALL)删除重复的行 (2认同)
  • 如果列具有相同的名称,`SELECT *` 不会产生正确的输出。`SELECT table_name_1.*, table_name_2.*` 对我有用。 (2认同)