4

请查看下表:

客户表:

ID
Name

订单表:

ID
CustomerID

一个客户可以下 0,1 个或多个订单。请看下面的 SQL 查询:

SELECT Customer.* 
FROM Customer LEFT JOIN Order ON Customer.ID=Order.CustomerID 
WHERE CustomerID IS NULL

SELECT Customer.* 
FROM Customer LEFT JOIN Order ON Customer.ID=Order.CustomerID AND
      CustomerID IS NULL

这两个查询有什么区别吗?开发人员何时会使用一种技术而不是另一种?

我以为网上会有其他类似的问题,但我没有找到答案,因此没有找到问题的原因。

4

5 回答 5

2

在结果集和查询计划方面,两者可能会产生相同的结果。

在这方面,它们是相同的。

如果谈论可读性,我会使用WHERE版本,因为连接条件是明确的,并且WHERE子句对于要包含/排除的结果是明确的。

于 2013-01-01T10:49:58.480 回答
1

我将尝试以我自己的方式解释:

考虑下表

tbl问题

QuestionId                   1                    2
QuestionTitle                Your Name?           Your Age?

tbl人

PersonId                     1                    2
PersonName                   Person1              Person2

tbl答案

AnswerId                     1
PersonId                     1
QuestionId                   1
Answer                       My Name is Person1

现在用WHERE试试这个查询,它只会返回一个结果。

SELECT  q.QuestionId, q.QuestionName, a.Answer
FROM    tblQuestions q
        LEFT OUTER JOIN tblAnswers a ON q.QuestionId = a.QuestionId
WHERE   a.PersonId = 2 OR a.PersonId IS null

现在用ON试试这个查询,它会返回两个结果。

SELECT  q.QuestionId, q.QuestionName, a.Answer 
FROM    tblQuestions q 
        LEFT OUTER JOIN tblAnswers a ON q.QuestionId = a.QuestionId AND
    (a.PersonId = 2 OR a.PersonId IS null)

结果的差异是因为文件管理器PersonId = 1 OR PersonId Is NULL,当通过结果应用此过滤器时,WHERE结果是一条记录,当它在“ON”中应用时,结果是两条记录。

于 2013-01-01T12:08:36.877 回答
0

如果您考虑结果,两者都将返回相同的结果。它们是有区别的。第一次查询,

SELECT Customer.* 
FROM Customer LEFT JOIN Order ON Customer.ID=Order.ID 
WHERE CustomerID IS NULL

首先将应用连接获取记录,并在它之上应用过滤器(Where)条件。

第二个查询,

SELECT Customer.* 
FROM Customer LEFT JOIN Order ON Customer.ID=Order.ID AND
      CustomerID IS NULL

在加入过程中,您将获得所需的结果。性能明智,这将是好的。

希望这有点道理!!

于 2013-01-01T10:52:34.307 回答
0

第一种情况将返回满足 where 条件的结果

第二种情况将返回结果,这将在两个条件下加入

于 2013-01-01T10:57:29.097 回答
0

选择的答案不正确。

第一个查询给出了所有没有订单的客户。第二个查询提供所有客户。

在第一个查询中,有订单的客户加入他们的订单。没有订单的客户因为左连接而存在。然后应用 Where - 有订单的客户被过滤掉,因为 CustomerID 不为空;没有订单的客户仍然存在。

在第二个查询中,无论你输入什么数据,都不可能有连接的记录,所以所有没有订单的客户都在场。没有连接条件可以同时为真(挑剔者的角落:除非您有一个带有空 ID 的客户记录和带有空 ID 的订单记录,并且您使用“SET ANSI_NULLS OFF”声明):“Customer.ID=Order .ID 和 CustomerID 为空”。

于 2013-01-03T22:02:39.297 回答