我有下表及其中的给定数据:
CREATE TABLE my_table
(
id INT,
data TEXT
);
INSERT INTO my_table VALUES (1, 'hello');
INSERT INTO my_table VALUES (2, 'hello');
INSERT INTO my_table VALUES (3, 'hello');
使用以下查询对其进行LEFT JOIN时
SELECT * FROM my_table t1
LEFT JOIN my_table t2 ON t1.data = t2.data;
我们按预期得到以下结果
1,hello,1,hello
1,hello,2,hello
1,hello,3,hello
2,hello,1,hello
2,hello,2,hello
2,hello,3,hello
3,hello,1,hello
3,hello,2,hello
3,hello,3,hello
我不明白的是,当我提出另一个应该驱逐所有记录的加入条件时,我们仍会得到3条记录
SELECT * from my_table t1
LEFT JOIN my_table t2 ON t1.data = t2.data AND t1.data = 'goodbye';
1,hello,<null>,<null>
2,hello,<null>,<null>
3,hello,<null>,<null>
但是,当WHERE子句放入相同的条件时,所有记录都被过滤掉
SELECT * FROM my_table t1
LEFT JOIN my_table t2 ON t1.data = t2.data
WHERE t1.data = 'goodbye';
看起来连接左侧的记录不能通过ON子句上的过滤器以任何方式删除,尽管它们可能是。是因为我们正在进行LEFT JOIN,因此Sqlite会保留左侧的所有记录,而忽略ON上可能删除它们的任何条件?
答案 0 :(得分:1)
LEFT OUTER JOIN的重点是保留左侧不匹配的行。这就是你在这里看到的。
SELECT * from my_table t1 LEFT JOIN my_table t2 ON t1.data = t2.data AND t1.data = 'goodbye'; 1,hello,null,null 2,hello,null,null 3,hello,null,null
前两列是左侧(t1)的不匹配行。后两列是在右侧(t2)列中连接的行,其中为null。
您可以通过从LEFT OUTER JOIN更改为INNER JOIN来消除所有行。我不知道你想要完成什么,所以我不知道你的情况是否是个好主意。