TSQL中存在多个JOIN问题



Northwind数据库Customer和Suppliers表都有Country列(DB中没有Country表,因此Country字段不是FK(。

阿根廷没有供应商,但有3个客户。

任务:";制作一份完整的国家/地区列表(来源于客户和供应商表(,其中包含每个国家/地区的客户和供应商总数。如果一个国家没有(NULL(客户或供应商,则输入0(零(";。

解决方案:

USE Northwind
GO
WITH
CountryList AS
(SELECT Country FROM Customers UNION SELECT Country FROM Suppliers),
SupplierCountry AS
(SELECT Country, TotalSuppliers=COUNT(*) FROM Suppliers GROUP BY Country),
CustomerCountry AS
(SELECT Country, TotalCustomers=COUNT(*) FROM Customers GROUP BY Country)
SELECT cl.Country, ISNULL(sc.TotalSuppliers,0) C, ISNULL(cc.TotalCustomers,0) TotalCustomers
FROM CountryList cl LEFT JOIN SupplierCountry sc ON cl.Country=sc.Country
LEFT JOIN CustomerCountry cc ON sc.Country=cc.Country

阿根廷的预期结果是:

Country TotalSuppliers TotalCustomers
Argentina 0 3

相反,结果是:

Argentina 0 0

(其他所有国家的模式相同,没有供应商,但有一些客户(

据理解,第一个LEFT JOIN产生一个中间结果"0";阿根廷0〃;。第二个LEFT JOIN应该与阿根廷的客户数(3(一起加入这一结果。

我想念什么?

您最后一次加入当前

LEFT JOIN CustomerCountry cc ON sc.Country=cc.Country

实际上应该是

Left JOIN CustomerCountry cc ON cl.Country=cc.Country

如果某个国家/地区有任何供应商,则sc.country与cl.country相同(由于之前加入(,但如果该国家/地区没有供应商,那么sc.county将为空。

最新更新