2012-03-27 8 views
0

Ich habe ein Problem. Ich habe zwei Tabellen mit den gleichen Spalten. Ich möchte eine dritte Tabelle erstellen, die ID-Zeilen von diesen beiden Tabellen haben wird, wobei vier ausgewählte Spalten gleich sind.SQL Server INNER JOIN mit Nullwert und Schnittpunkt

Ich löste Problem mit dem Vergleichen von Daten Null mit Isnull.

schrieb ich etwas wie folgt aus:

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 

Alles funktioniert, außer dass Code in Ordnung:

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

unterschiedliche Anzahl der Zeilen, die der erste Code zurückgegeben.

Was mache ich falsch?

Antwort

2

Dies kann nur durch Duplikate von (City, Street, HouseNumber, PostCode) Spalten erklärt werden. Intersect gibt genau one Zeile für alle duplizierten Daten zurück, aber innere Verknüpfung erstellt n*m übereinstimmende Zeilen. Könnten Sie bitte überprüfen, dass diese vier Spalten sowohl im Gymnasium als auch in der Primarschule einzigartig sind?

+0

Sie hatten Recht. Ich habe doppelte Zeilen in diesen Tabellen. Danke für die Antwort! –

0

Die einzige Sache, die Sie falsch machen, erwartet, dass die zwei Abfragen die gleiche Anzahl von Zeilen zurückgeben.

In der ersten ersetzen Sie Nullen durch '999999' und vergleichen dann den resultierenden Wert. Das macht alle Nullen gleich allen anderen Nullen (und dem Wert '999999', obwohl dieser Wert vermutlich nicht auftritt).

In der zweiten Abfrage tun Sie in der Kreuzung, ohne die Nullen zu ersetzen. NULL ist niemals gleich einem anderen Wert (einschließlich anderer NULL-Werte), sodass weniger Zeilen zurückgegeben werden.

+0

Vielleicht lese ich das nicht richtig, aber ich denke, das ist nicht wahr. Zitat aus MSDN: [Wenn Sie Zeilen zum Ermitteln unterschiedlicher Werte vergleichen, werden zwei NULL-Werte als gleich betrachtet.] (Http://msdn.microsoft.com/en-us/library/ms188055.aspx). Schnelltest zeigt an, dass eine Zeile zurückgegeben wird: 'select 'a', null intersect wählen Sie 'a', null' –