我写了2条SQL语句。
SELECT
customers.CustomerID,
orders.OrderID
FROM customers LEFT JOIN orders ON customers.CustomerID =
orders.CustomerID AND orders.EmployeeID=4
WHERE orders.OrderID IS NULL;
还有
SELECT
customers.CustomerID,
orders.OrderID
FROM customers LEFT JOIN orders ON customers.CustomerID =
orders.CustomerID AND orders.EmployeeID=4 AND orders.OrderID IS NULL;
第一个返回16个条目,这是正确的(根据解决方案)。第二个返回91个条目。我将Northwind用于mysql版本。我从某处了解到,将条件放在JOIN语句中等同于在WHERE语句中进行。但是,在这里我可以看到区别。
答案 0 :(得分:2)
这与对语句的订单执行以及您正在使用LEFT JOIN
的事实有关。
LEFT JOIN
将保留左侧的所有值不变,仅组合右侧与条件匹配的值。
WHERE
子句对整个查询 进行操作(在这种情况下)。
查询1:
查询2:
WHERE
真正类似于JOIN
的唯一时刻是INNER JOIN
之类的东西,它仅从左侧和右侧获得相关值。我认为至少自从我发挥SQL力量以来已经有一段时间了。
编辑-计算customers
表中的行数(无),它也应返回91。
答案 1 :(得分:1)
第二个查询将返回更多行。为什么?继续阅读:
第二个查询
第二个查询将使用谓词将orders
行与customers
行匹配:
customers.CustomerID = orders.CustomerID ANDorders.EmployeeID = 4 ANDorders.OrderID为空
不匹配的customers
行将始终显示在结果中。
第一个查询
现在,第一个查询将使用谓词将orders
行与customers
行进行匹配:
customers.CustomerID = orders.CustomerID ANDorders.EmployeeID = 4
然后它将过滤掉orders.OrderID
为空的行,并删除未填充最后一个谓词的customer
行,从而产生更少的行。未匹配的客户行可能不会显示在结果中。
示例:
create table customers (
CustomerId int
);
create table orders (
OrderId int,
CustomerId int,
EmployeeId int
);
insert into customers (CustomerId) values (1), (2), (3);
insert into orders (OrderId, CustomerId, EmployeeId) values
(1001, 1, 3),
(1002, 1, 4),
(1003, 2, 1);
第一个查询返回:
CustomerId OrderId
---------- ----------------
2 <null>
3 <null>
第二个查询返回时:
CustomerId OrderId
---------- ----------------
1 <null>
2 <null>
3 <null>
答案 2 :(得分:0)
这可能是由于Sql查询运行的顺序 FROM和JOIN。首先执行FROM子句和后续的JOIN,然后 在哪里,最后选择。
在第二种情况下,所有联接条件都同时存在,但是在第一种情况下,where子句在联接数据和过滤后产生的差异不是同时发生的,而是联接后的整体情况。