2012-03-27 21 views
0

我遇到問題。我有兩個相同列的表。我想創建一個第三個表,這個表中將有兩個表中的id行,其中四個選擇的列將是相同的。SQL Server INNER與NULL值相交併相交

我解決了比較數據null與isnull的問題。

我寫了這樣的事情:

WITH cteCandidates (City, Street, HouseNumber, PostCode) 
    AS 
    (
    SELECT City, Street, HouseNumber, PostCode 
    FROM Gymnasium 
    INTERSECT 
    SELECT City, Street, HouseNumber, PostCode 
    FROM PrimarySchool 
) 
    select e.Id as 'Gymnasium', 
    p.Id as 'PrimarySchool' 
FROM 
    Gymnasium AS e 
Inner join cteCandidates AS c 
    on isnull(e.City  ,'999999') = isnull(c.City  ,'999999') 
    AND isnull(e.Street  ,'999999') = isnull(c.Street  ,'999999') 
    AND isnull(e.HouseNumber,'999999') = isnull(c.HouseNumber,'999999') 
    AND isnull(e.PostCode ,'999999') = isnull(c.PostCode ,'999999') 
inner join PrimarySchool as p 
    on isnull(e.City  ,'999999') = isnull(p.City  ,'999999') 
    AND isnull(e.Street  ,'999999') = isnull(p.Street  ,'999999') 
    AND isnull(e.HouseNumber,'999999') = isnull(p.HouseNumber,'999999') 
    AND isnull(e.PostCode ,'999999') = isnull(p.PostCode ,'999999') 
order by PrimarySchool 

一切正常,只是代碼:

SELECT City, Street, HouseNumber, PostCode 
    FROM Gymnasium 
    INTERSECT 
    SELECT City, Street, HouseNumber, PostCode 
    FROM PrimarySchool 

返回不同數目的行第一代碼。

我在做什麼錯?

回答

2

這隻能通過(城市,街道,HouseNumber,PostCode)列的重複項來解釋。 Intersect將精確返回所有重複數據的one行,但內部連接將創建n*m匹配的行。您能否確認這四個欄目在Gymnasium和PrimarySchool中都是獨一無二的?

+0

你說得對。我在這些表中有重複的行。 Thx回答! – 2012-04-03 09:15:01

0

您唯一做錯的事情是期待兩個查詢返回相同數量的行。

首先,您用'999999'替換空值,然後比較結果值。這使得所有的零點都等於所有其他的零點(並且值'999999',儘管假設該值不會發生)。

在第二個查詢中,您正在做交叉而不替換空值。 NULL永遠不會等於任何其他值(包括其他NULL),因此它將返回更少的行。

+0

也許我不是讀這個權利,但我認爲這是不正確的。從MSDN引用:[當您比較確定不同值的行時,兩個NULL值被認爲是相等的。](http://msdn.microsoft.com/zh-cn/library/ms188055.aspx)。快速測試顯示將返回一行:'select'a',null 相交 選擇'a',null' – 2012-03-27 21:16:56