2013-01-10 36 views
0

我有一个巨大的表,其中包含送货地址信息和帐单地址信息。我可以通过以下两个独立表格获得独特的运费和帐单地址:联合选择不同的语法?

SELECT DISTINCT ShipToName, ShipToAddress1, ShipToAddress2, ShipToAddress3, ShipToCity, ShipToZipCode 
FROM Orders 
ORDER BY Orders.ShipToName 

SELECT DISTINCT BillToName, BillToAddress1, BillToAddress2, BillToAddress3, BillToCity, BillToZipCode 
FROM Orders 
ORDER BY Orders.BillToName 

我如何获得两者的不同交叉点?我不确定语法。

+3

既然你接受了联盟的答案,我假设你的意思是工会不交集。 – Paparazzi

+0

是的,我很抱歉。 – BBauer42

回答

1

可以在所有领域加入两套,这将返回匹配的记录:

SELECT * 
FROM Orders o1 
INNER JOIN Orders o2 
    ON o1.ShipToName = o2.BillToName 
    AND o1.ShipToAddress1 = o2.BillToAddress1 
    AND o1.ShipToAddress2 = o2.BillToAddress2 
    AND o1.ShipToAddress3 = o2.BillToAddress3 
    AND o1.ShipToCity = o2.BillToCity 
    AND o1.ShipToZipCode = o2.BillToZipCode 

或者你应该能够使用INTERSECT:

SELECT ShipToName, ShipToAddress1, ShipToAddress2, ShipToAddress3, ShipToCity, ShipToZipCode 
FROM Orders 
INTERSECT 
SELECT BillToName, BillToAddress1, BillToAddress2, BillToAddress3, BillToCity, BillToZipCode 
FROM Orders 

或者甚至是查询(UNION删除两组数据之间的重复项):

SELECT ShipToName, ShipToAddress1, ShipToAddress2, ShipToAddress3, ShipToCity, ShipToZipCode 
FROM Orders 
UNION 
SELECT BillToName, BillToAddress1, BillToAddress2, BillToAddress3, BillToCity, BillToZipCode 
FROM Orders 
+0

这不符合预期。现在我发布的两个查询分别是1687和805的返回表。相交的表格仅显示312,并且仅具有船到列。如果我快速查看数据,我会看到许多地址(不重复)丢失。 – BBauer42

+0

也许我应该澄清,从上面返回的两个表中,我想返回所有唯一的ShipToName/BillToName,ShipAddress1/BillAddress1,ShipAddress2/BillAddress2,ShipAddresss3/BillAddress3,ShipToZipCode/BillToZipCode组合。 – BBauer42

+0

@ BBauer42也许你应该发布一些样本数据和期望的结果。 – Taryn

2

这样的事情?

SELECT DISTINCT 
    toname, addr1, addr2, addr3, city, zip 
FROM 
    (SELECT DISTINCT 
     ShipToName AS toName, 
     ShipToAddress1 AS addr1, 
     ShipToAddress2 AS addr2, 
     ShipToAddress3 AS addr3, 
     ShipToCity AS city, 
     ShipToZipCode AS zip 
    FROM 
     Orders 

    UNION ALL 

    SELECT DISTINCT 
    BillToName AS toName, 
    BillToAddress1 AS addr1, 
    BillToAddress2 AS addr2, 
    BillToAddress3 AS addr3, 
    BillToCity AS city, 
    BillToZipCode AS zip 
    FROM 
     Orders) o 
ORDER BY ToName 
+0

谢谢!完美工作。 – BBauer42

2

你说“交集”,但你接受了联盟的答案,所以我想你只想UNION DISTINCT。无需派生表和三个DISTINCT。你可以使用简单的:

SELECT 
    ShipToName  AS Name, 
    ShipToAddress1 AS Address1, 
    ShipToAddress2 AS Address2, 
    ShipToAddress3 AS Address3, 
    ShipToCity  AS City, 
    ShipToZipCode AS ZipCode 
FROM 
    Orders 

UNION        --- UNION means UNION DISTINCT 

SELECT 
    BillToName 
    BillToAddress1, 
    BillToAddress2, 
    BillToAddress3, 
    BillToCity, 
    BillToZipCode 
FROM 
    Orders 

ORDER BY 
    Name ; 
+0

+1我想我应该留下我的答案,因为它包含了一个'UNION'版本。 :) – Taryn

+0

@bluefeet你没有? (我没有检查你的编辑)彻底。请取消删除。 –

+0

Naaw,好的。这个问题并不清楚,所以我的回答有几个不同的问题。 'INNER JOIN','INTERSECT'和'UNION'。 – Taryn