SQLite只有INNER和LEFT JOIN。
有没有一种方法可以用SQLite进行完全的外连接?
发布于 2009-12-18 01:27:56
可以,请参阅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
发布于 2021-05-15 11:55:36
我将迟来提出我的2美分。考虑下面两个简单的表people1和people2:
id name age
0 1 teo 59
1 2 niko 57
2 3 maria 54
id name weight
0 1 teo 186
1 2 maria 125
2 3 evi 108
首先,我们创建一个临时视图v_all,在这里我们使用UNION连接两个相对的左连接,如下所示:
CREATE TEMP VIEW v_all AS
SELECT p1.name AS name1, p1.age,
p2.name AS name2, p2.weight
FROM people1 p1
LEFT JOIN people2 AS p2
USING (name)
UNION
SELECT p1.name AS name1, p1.age,
p2.name AS name2, p2.weight
FROM people2 AS p2
LEFT JOIN people1 AS p1
USING (name);
但是,我们最终得到两个name列,name1和name2,它们可能具有空值或相等值。我们想要的是在单个列名中组合name1和name2。我们可以使用一个案例查询来实现这一点,如下所示:
SELECT age,weight,
CASE
WHEN name1 IS NULL
THEN name2
WHEN name2 IS NULL
THEN name1
WHEN name1=name2
THEN name1
END name
FROM v_all
我们最终会得到:
name weight age
0 evi 108 None
1 maria 125 54
2 niko None 57
3 teo 186 59
当然,您可以在一个查询中组合这两个查询,而不必创建临时视图。我避免这样做,是为了强调只有2个左连接和一个并集的不足,这是我到目前为止所看到的建议。
https://stackoverflow.com/questions/1923259
复制相似问题