为什么Sqlite始终将左侧记录保留在LEFT JOIN中

时间:2016-08-29 14:45:16

标签: postgresql sqlite left-join

我有下表及其中的给定数据:

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上可能删除它们的任何条件?

1 个答案:

答案 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来消除所有行。我不知道你想要完成什么,所以我不知道你的情况是否是个好主意。