了解ON与多个条件和JOIN中的WHERE之间的区别

时间:2013-09-03 23:52:24

标签: sql sql-server

我会列出一些查询。输出在稍后给出,直到最后。

这个查询给了我7行。

SELECT
S.companyname AS supplier, S.country,
P.productid, P.productname, P.unitprice
FROM Production.Suppliers AS S
LEFT OUTER JOIN Production.Products AS P
ON S.supplierid = P.supplierid
WHERE S.country = N'Japan'
ORDER BY S.country

下一个查询与上面相同,只是WHERE被AND替换。这给了34 行。

SELECT
S.companyname AS supplier, S.country,
P.productid, P.productname, P.unitprice
FROM Production.Suppliers AS S
LEFT OUTER JOIN Production.Products AS P
ON S.supplierid = P.supplierid
AND S.country = N'Japan'
ORDER BY S.country

我不明白为什么第二个查询的输出如下所示。请解释一下。


输出1 -

supplier            country productid   productname unitprice
Supplier QOVFD  Japan   9           Product AOZBW   97.00
Supplier QOVFD  Japan   10          Product YHXGE   31.00
Supplier QOVFD  Japan   74          Product BKAZJ   10.00
Supplier QWUSF  Japan   13          Product POXFU   6.00
Supplier QWUSF  Japan   14          Product PWCJB   23.25
Supplier QWUSF  Japan   15          Product KSZOI   15.50
Supplier XYZ    Japan   NULL            NULL    NULL

输出2 -

supplier,country,productid,productname,unitprice
Supplier GQRCV,Australia,NULL,NULL,NULL
Supplier JNNES,Australia,NULL,NULL,NULL
Supplier UNAHG,Brazil,NULL,NULL,NULL
Supplier ERVYZ,Canada,NULL,NULL,NULL
Supplier OGLRK,Canada,NULL,NULL,NULL
Supplier XOXZA,Denmark,NULL,NULL,NULL
Supplier ELCRN,Finland,NULL,NULL,NULL
Supplier ZRYDZ,France,NULL,NULL,NULL
Supplier OAVQT,France,NULL,NULL,NULL
Supplier LVJUA,France,NULL,NULL,NULL
Supplier ZPYVS,Germany,NULL,NULL,NULL
Supplier SVIYA,Germany,NULL,NULL,NULL
Supplier TEGSC,Germany,NULL,NULL,NULL
Supplier KEREV,Italy,NULL,NULL,NULL
Supplier ZWZDM,Italy,NULL,NULL,NULL
Supplier XYZ,Japan,NULL,NULL,NULL
Supplier QWUSF,Japan,13,Product POXFU,6.00
Supplier QWUSF,Japan,14,Product PWCJB,23.25
Supplier QWUSF,Japan,15,Product KSZOI,15.50
Supplier QOVFD,Japan,9,Product AOZBW,97.00
Supplier QOVFD,Japan,10,Product YHXGE,31.00
Supplier QOVFD,Japan,74,Product BKAZJ,10.00
Supplier FNUXM,Netherlands,NULL,NULL,NULL
Supplier NZLIF,Norway,NULL,NULL,NULL
Supplier CIYNM,Singapore,NULL,NULL,NULL
Supplier EQPNC,Spain,NULL,NULL,NULL
Supplier QQYEU,Sweden,NULL,NULL,NULL
Supplier QZGUF,Sweden,NULL,NULL,NULL
Supplier BWGYE,UK,NULL,NULL,NULL
Supplier SWRXU,UK,NULL,NULL,NULL
Supplier VHQZD,USA,NULL,NULL,NULL
Supplier STUAZ,USA,NULL,NULL,NULL
Supplier JDNUG,USA,NULL,NULL,NULL
Supplier UHZRG,USA,NULL,NULL,NULL

3 个答案:

答案 0 :(得分:3)

LEFT JOIN会带回“左”表中的所有记录,除非您限制它,就像使用WHERE条件一样。

当您将其更改为JOIN条件的一部分时,它不会限制结果,只是限制哪些记录具有来自右表的非NULL值。

答案 1 :(得分:1)

因为您正在进行左连接,所以它总是返回第一个表中的所有内容(Production.Suppliers)。

在第一个示例中,Where子句将Suppliers表过滤为仅显示“Japan”。 查询类似于:

  

“给我日本的所有供应商并向我展示他们的产品”

当您进行连接时,您正在为要加入的表添加条件(Production.Products)。因为它是一个左连接,所以您将支持所有供应商,并且只有拥有日本供应商的产品。你说的是:

  

“给我所有供应商,并向我提供供应商在日本的所有产品

这是一个微妙的区别,但对于左连接而言是一个非常重要的区别。

如果它是inner join而不是left join那么你就不会有这个问题,但你会再问一个不同的问题:

  

“给我所有在日本拥有产品的供应商”

答案 2 :(得分:0)

这是因为ON将AND之后的部分视为JOIN的条件,因此如果不满足条件,它将从P返回NULL结果。

您几乎不应该在不使用连接中的表的连接上添加条件(在这种情况下,您正在加入P,但在仅引用S的连接上应用条件)。