2015-10-14 85 views
0

select语句返回位于独特城市和州中的每个供应商的名称,城市和州(即排除与另一个供应商具有相同城市和州的供应商)SQL Server - 相关子查询/自加入

SELECT 
    VendorName, VendorCity, VendorState 
FROM 
    Vendors 
WHERE 
    VendorState + VendorCity NOT IN (SELECT VendorState + VendorCity 
            FROM Vendors 
            GROUP BY VendorState + VendorCity 
            HAVING COUNT(*) > 1) 
ORDER BY 
    VendorState, VendorCity; 

备选答案

SELECT 
    VendorName, VendorCity, VendorState 
FROM 
    Vendors AS Vendors_Main 
WHERE 
    VendorCity + VendorState NOT IN (SELECT VendorCity + VendorState 
            FROM Vendors AS Vendors_Sub 
            WHERE Vendors_Sub.VendorID <> Vendors_Main.VendorID) 
ORDER BY 
    VendorState, VendorCity; 

我明白了第一个答案,而不是替代查询。混乱点:下面的行不会返回0行,因为它们引用同一个表而没有额外的where子句?

WHERE Vendors_Sub.VendorID <> Vendors_Main.VendorID) 

回答

0

WHERE Vendors_Sub.VendorID <> Vendors_Main.VendorID)不比较同一表的同一行。

相关子在逻辑上被执行一次用于在外部查询的每一行,在你的情况下,它具有相同的VendorCity/VendorState组合检查的行,但不同VendorIDs

其实我宁愿直接翻译成相关NOT EXISTS

SELECT VendorName, VendorCity, VendorState 
FROM Vendors AS Vendors_Main 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM Vendors AS Vendors_Sub 
    WHERE Vendors_Sub.VendorCity = Vendors_Main.VendorCity -- same city 
    AND Vendors_Sub.VendorState = Vendors_Main.VendorState -- same state 
    AND Vendors_Sub.VendorID <> Vendors_Main.VendorID -- different vendor 
) 
ORDER BY VendorState, VendorCity; 

这可以防止误报像'state' + 'acity''statea' + 'city'这两个串联为“stateacity'并适用于任何类型的数据类型。

0
SELECT VendorName , 
     VendorCity , 
     VendorState 
FROM Vendors AS Vendors_Main 
WHERE VendorCity + VendorState NOT IN 
    (
     SELECT VendorCity + VendorState 
     FROM Vendors AS Vendors_Sub 
     WHERE Vendors_Sub.VendorID <> Vendors_Main.VendorID 
    ) 
ORDER BY VendorState ,VendorCity; 

子查询

SELECT VendorCity + VendorState 
FROM Vendors AS Vendors_Sub 
WHERE Vendors_Sub.VendorID <> Vendors_Main.VendorID 

将不包括具有相同id主查询返回的vendorCity + vendorState所有现有组合的每一行。将子查询设想为主查询中每行的函数。

如果WHERE Vendors_Sub.VendorID <> Vendors_Main.VendorID不存在,则每个主要查询行都将与子查询中的自身相匹配,并且整个查询将不返回任何行,因为这些组合都不会是唯一的。