gpt4 book ai didi

sql - 连接中 "and"和 "where"之间的差异

转载 作者:行者123 更新时间:2023-12-02 06:19:00 24 4
gpt4 key购买 nike

有什么区别

SELECT DISTINCT field1 
FROM table1 cd
JOIN table2
ON cd.Company = table2.Name
and table2.Id IN (2728)

SELECT DISTINCT field1 
FROM table1 cd
JOIN table2
ON cd.Company = table2.Name
where table2.Id IN (2728)

两者都返回相同的结果,并且都有相同的解释输出

最佳答案

首先存在语义差异。当您有联接时,您是说两个表之间的关系是由该条件定义的。因此,在您的第一个示例中,您说这些表通过 cd.Company = table2.Name AND table2.Id IN (2728) 相关。 。当您使用 WHERE 子句时,您是在说关系是由 cd.Company = table2.Name 定义的。并且您只需要条件 table2.Id IN (2728) 的行适用。尽管它们给出了相同的答案,但对于阅读您的代码的程序员来说,这意味着非常不同的事情。

在这种情况下,WHERE 子句几乎肯定就是您的意思,因此您应该使用它。

其次,在使用 LEFT JOIN 而不是 INNER JOIN 的情况下,结果实际上有所不同。如果将第二个条件作为联接的一部分包含在内,则在条件失败时您仍将获得结果行 - 您将从左表中获得值,并在右表中获得空值。如果您将该条件包含在 WHERE 子句中,并且该条件失败,您将根本无法获取该行。

这是一个演示这一点的示例。

查询 1(何处):

SELECT DISTINCT field1
FROM table1 cd
LEFT JOIN table2
ON cd.Company = table2.Name
WHERE table2.Id IN (2728);

结果:

field1
200

查询 2(AND):

SELECT DISTINCT field1
FROM table1 cd
LEFT JOIN table2
ON cd.Company = table2.Name
AND table2.Id IN (2728);

结果:

field1
100
200

使用的测试数据:

CREATE TABLE table1 (Company NVARCHAR(100) NOT NULL, Field1 INT NOT NULL);
INSERT INTO table1 (Company, Field1) VALUES
('FooSoft', 100),
('BarSoft', 200);

CREATE TABLE table2 (Id INT NOT NULL, Name NVARCHAR(100) NOT NULL);
INSERT INTO table2 (Id, Name) VALUES
(2727, 'FooSoft'),
(2728, 'BarSoft');

关于sql - 连接中 "and"和 "where"之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2559194/

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