Beitritt zur selben Tabelle in SQL – SQL server 2008

Ich habe die folgende Tabelle:

ID Type Description IDOfSystem -------------------------------- 1000 Company Company Item NULL 1010 System System Item NULL 1020 Company NULL 1010 

Ich habe System- und Firmenposten. Ich muss eine ausgewählte Abfrage schreiben, die alle Firmenelemente und Systemobjekte abruft, wenn ein Firmenelement einen Wert in IDOfSystem Ich muss dieses IDOfSystem ausschließen und die Beschreibung aus dem IDOfSystem .

Also, angesichts der obigen Tabelle, die SQL-Auswahl sollte die Zeilen 1000, 1020 (mit "System Item") als die Beschreibung.

Wenn 1020 nicht existiert, würde ich einfach 1000 und 1010 bekommen.

Ich glaube, ich kann dies in mehrere Abfragen brechen und eine UNION . Ich habe versucht, eine linke äußere Verknüpfung auf dem gleichen Tisch zu machen, konnte aber nicht die Beschreibung aus der Systemzeile erhalten.

Irgendeine Hilfe?

Dieser Ansatz nutzt eine Selbstverknüpfung, um die Beschreibung des entsprechenden Systems nachzuschlagen. Eine separate Unterabfrage filtert die referenzierten Systeme aus.

 select yt1.Id , yt1.Type , coalesce(yt2.Description, yt1.Description) as Description from YourTable yt1 left join YourTable yt2 on yt1.type = 'Company' and yt2.type = 'System' and yt2.ID = yt1.IDOfSystem where yt1.type in ('System', 'Company') and not exists ( select * from YourTable yt3 where yt1.type = 'System' and yt3.type = 'Company' and yt1.ID = yt3.IDOfSystem ) 

Arbeitsbeispiel bei SE data.

 SELECT ID, Type, Description FROM MyTable AS A WHERE IDOfSystem IS NULL AND NOT EXISTS (SELECT * FROM MyTable AS B WHERE B.IDOfSystem = A.ID) UNION ALL SELECT A.ID, A.Type, B.Description FROM MyTable AS A INNER JOIN MyTable AS B ON A.IDOfSystem = B.ID WHERE IDOfSystem IS NOT NULL 

Was ich tue, wählt zuerst alle Zeilen aus, die kein referenziertes System haben und nicht als ein anderes Zeilensystem verwendet werden.

Dann mache ich eine Vereinigung mit einer anderen Abfrage, die alle Zeilen mit einem referenzierten System findet und sich dem System anschließen, um die Beschreibung zu ergreifen.

 SELECT Companies.ID ,Companies.Type ,COALESCE(Systems.Description, Companies.Description) as Description FROM YourTable Companies LEFT OUTER JOIN YourTable Systems on Systems.ID = Companies.IDOfSystem WHERE NOT EXISTS ( SELECT * FROM YourTable T3 WHERE T3.IDOfSystem = Companies.ID ) 

Hier läuft es auf SEDE.

Ich bin sicher, es gibt bessere Möglichkeiten, dies zu tun, aber versuchen Sie:

 SELECT A.Id, A.Type, ISNULL(A.Description,B.Description) Description, A.IDOfsystem FROM YourTable A LEFT JOIN YourTable B ON A.IDOFSystem = B.ID WHERE A.ID NOT IN (SELECT IDOfsystem FROM YourTable WHERE IDOfsystem IS NOT NULL)