Skip to main content

如何模拟SQLite完全外部连接子句

SQL完全外部连接子句简介

理论上,完全外部连接的结果是左连接和右连接的组合。对于另一个表中没有匹配行的表的每一列,完整外部联接的结果集都有空值。对于匹配的行,完全外部联接生成一行,其中包含两个表中行的列中的值。

下图说明了完全外部联接子句的结果:

SQLite full outer join

请参见以下猫和狗表。

-- create and insert data into the dogs table
CREATE TABLE dogs (
type TEXT,
color TEXT
);

INSERT INTO dogs(type, color)
VALUES('Hunting','Black'), ('Guard','Brown');

-- create and insert data into the cats table
CREATE TABLE cats (
type TEXT,
color TEXT
);

INSERT INTO cats(type,color)
VALUES('Indoor','White'),
('Outdoor','Black');

下面的语句使用FULL OUTER JOIN子句从dogs和cats表中查询数据。

SELECT *
FROM dogs
FULL OUTER JOIN cats
ON dogs.color = cats.color;

下面显示了上述声明的结果:

不幸的是,SQLite不支持RIGHT JOIN子句,也不支持FULL OUTER JOIN子句。但是,通过使用LEFT JOIN子句,可以轻松地模拟完整的外部联接。

模拟SQLite完全外部连接

下面的语句模拟SQLite中的完整外部连接子句:

SELECT d.type,
d.color,
c.type,
c.color
FROM dogs d
LEFT JOIN cats c USING(color)
UNION ALL
SELECT d.type,
d.color,
c.type,
c.color
FROM cats c
LEFT JOIN dogs d USING(color)
WHERE d.color IS NULL;

查询是如何工作的。

在本教程中,您学习了如何使用UNION ALL和LEFT JOIN子句来模拟SQLite FULL OUTER JOIN子句。