gpt4 book ai didi

postgresql - 为什么 Sqlite 总是在 LEFT JOIN 中保留左侧记录

转载 作者:行者123 更新时间:2023-11-29 13:22:30 24 4
gpt4 key购买 nike

我有下表,其中包含给定的数据:

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

最佳答案

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,null2,hello,null,null3,hello,null,null

前两列是从左侧 (t1) 开始的不匹配行。后两列是右侧列 (t2) 中为空的连接行。

您可以通过将 LEFT OUTER JOIN 更改为 INNER JOIN 来消除所有行。我不知道你想要完成什么,所以我不知道这对你来说是否是个好主意。

关于postgresql - 为什么 Sqlite 总是在 LEFT JOIN 中保留左侧记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39209035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com