1

我将列出一些查询。输出稍后给出,接近尾声。

这个查询给了我 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
4

3 回答 3

3

ALEFT JOIN从“LEFT”表中带回每条记录,除非您限制它,就像您对WHERE标准所做的那样。

当您将其更改为标准的一部分时,JOIN它不会限制结果,只是限制哪些记录具有正确表中的非 NULL 值。

于 2013-09-03T23:54:24.157 回答
1

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

在第一个示例中,Where 子句过滤了供应商表以仅显示“日本”。查询类似于:

“给我所有日本的供应商,让我看看他们的产品”

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

“给我所有的供应商,把供应商在日本的所有产品都给我”

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

如果它是 ainner join而不是 aleft join那么你就不会遇到这个问题,但你会再次问一个不同的问题:

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

于 2013-09-04T00:00:40.100 回答
0

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

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

于 2013-09-03T23:56:22.070 回答