我会列出一些查询。输出在稍后给出,直到最后。
这个查询给了我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
答案 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的连接上应用条件)。