Sql 不是对手,因为你添加了一个不可能的条件。外部联接的结果是,应该来自表2的字段将替换为null。因为这就是外部联接的定义方式

Sql 不是对手,因为你添加了一个不可能的条件。外部联接的结果是,应该来自表2的字段将替换为null。因为这就是外部联接的定义方式,sql,Sql,现在进入现实世界的表格: 实际上,订单中没有OrderID为null的记录(除非设计得非常糟糕)。因此,如果将该条件放在ON子句中,它将找不到符合条件的记录 在这种情况下,由于这是一个外部(左)联接,您将获得所有原始客户记录,并且由于没有匹配项,因此每个记录的Orders字段都为空 在将条件放在where中的情况下,您实际上充分利用了左连接的这种行为。您将每个客户与其订单进行匹配。如果有匹配项-很好,您就得到了实际的订单ID。但是如果没有匹配项-您正在寻找的匹配项-它会添加一个空订单ID whe

现在进入现实世界的表格:

实际上,订单中没有OrderID为null的记录(除非设计得非常糟糕)。因此,如果将该条件放在ON子句中,它将找不到符合条件的记录

在这种情况下,由于这是一个外部(左)联接,您将获得所有原始客户记录,并且由于没有匹配项,因此每个记录的Orders字段都为空

在将条件放在
where
中的情况下,您实际上充分利用了左连接的这种行为。您将每个客户与其订单进行匹配。如果有匹配项-很好,您就得到了实际的订单ID。但是如果没有匹配项-您正在寻找的匹配项-它会添加一个空订单ID


where子句告诉它只提供发生的记录。也就是说,在Orders中没有匹配顺序的记录。

左外部联接保留左(第一)表中不匹配的行,并将它们与右(第二)表形状的空行联接。 让我们举一个具体的例子。 比如说,Customers表有
{c1,“n1”},{c2,“n2”}
订单有
{c1,o1}
第1例: 左外部联接将导致:

{c1,"n1", o1}, {c2,"n2", null}

现在,你知道where和“and”的区别了。Where找出哪里的orderid为空,对于和,没有客户id匹配且订单id为空的情况

必须指出这两个查询非常不同。第一个查询是:

SELECT c.CustomerID, c.CustomerName, o.OrderID
FROM Customers c LEFT OUTER JOIN
     Orders o
     ON c.CustomerID = o.CustomerID
WHERE o.OrderID IS NULL;
它返回没有相应订单的所有客户(或
o.OrderId
为空)。之所以这样做,是因为
左外部联接将保留第一个表中的所有行。如果不匹配,则第二个表中的所有列都是
NULL
,而
where
子句将选择这些列

第二个问题:

SELECT c.CustomerID, c.CustomerName, o.OrderID
FROM Customers c LEFT OUTER JOIN
     Orders o
     ON c.CustomerID = o.CustomerID AND
        o.OrderID IS NULL;
查找所有客户的所有行,并获取
OrderId
为空的订单信息(如果存在任何此类记录)。不过滤
客户
,因为
左外部联接
保证第一个表中的所有行都在结果集中


如果一个名为
OrderId
的字段出现
NULL
值,我会感到惊讶。但是,每个查询都是有效的SQL,并且每个查询都做了一些有用的事情。但是,其中只有一个符合您的意愿。

我直观地理解您为什么会这样想,但我认为原因是“ON”用于在给定条件下联接表。您要做的是查找条件为true的行。我不知道这是否接近事实,但这是我对它的思考方式,我知道什么时候该用什么。而o.OrderID就是把事情搞砸的那个。它将正常工作,直到它击中目标。。。。条件。好吧,我现在有点明白了,为什么这个和不会按照我想要的方式工作。它将只查看orders表和ordersID列,并将发现没有一个为null。但我不明白为什么它会把它们设为空@RealSkeptic@FrostyStrawOrderID中的NULL值表示没有任何记录与c.CustomerID=o.CustomerID上的条件
匹配,o.OrderID为NULL
@FrostyStraw我在回答中添加了一些关于外部联接性质的解释,我希望这能帮助你理解原因。我得到了很多很好的答案,但你画出表格并解释它们让我很好地理解了@realponsilt
Get CustomerID, Name, and OrderID from
Customers Link to Orders where CustomerID matches and Order ID is null
Table A Table B ┌──────┬──────┐ ┌──────┬──────┐ │field1│field2│ │field3│field4│ ├──────┼──────┤ ├──────┼──────┤ │A │1 │ │1 │One │ │B │2 │ │3 │Three │ │C │3 │ └──────┴──────┘ └──────┴──────┘ ┌──────┬──────┬──────┬──────┐ │field1│field2│field3│field4│ ├──────┼──────┤──────┼──────┤ │A │1 │1 │One │ │C │3 │3 │Three │ └──────┴──────┴──────┴──────┘ ┌──────┬──────┬──────┬──────┐ │field1│field2│field3│field4│ ├──────┼──────┤──────┼──────┤ │A │1 │1 │One │ │B │2 │NULL │NULL │⬅︎ No match │C │3 │3 │Three │ └──────┴──────┴──────┴──────┘ ┌──────┬──────┬──────┬──────┐ │field1│field2│field3│field4│ ├──────┼──────┤──────┼──────┤ │A │1 │NULL │NULL │⬅︎ No match (because of impossible condition) │B │2 │NULL │NULL │⬅︎ No match (because of impossible condition) │C │3 │NULL │NULL │⬅︎ No match (because of impossible condition) └──────┴──────┴──────┴──────┘
{c1,"n1", o1}, {c2,"n2", null}
SELECT c.CustomerID, c.CustomerName, o.OrderID
FROM Customers c LEFT OUTER JOIN
     Orders o
     ON c.CustomerID = o.CustomerID
WHERE o.OrderID IS NULL;
SELECT c.CustomerID, c.CustomerName, o.OrderID
FROM Customers c LEFT OUTER JOIN
     Orders o
     ON c.CustomerID = o.CustomerID AND
        o.OrderID IS NULL;