2016-07-12 5 views
1

Angenommen, wir haben die folgenden Daten in der Tabelle My_Tabel genannt:Auswählen eindeutiger Werte aus sich selbst verweisende Tabelle

╔═══════════╦═════════════╦════════════╗ 
║ ID  ║ Person_Name ║ Partner_ID ║ 
╠═══════════╬═════════════╬════════════╬ 
║ 101  ║ John  ║ 3   ║ 
║ 100  ║ Miller  ║ 0   ║ 
║ 3  ║ Ruby  ║ 101  ║ 
║ 180  ║ Jack  ║ 0   ║ 
║ 199  ║ George  ║ 65   ║ 
║ 23  ║ Joseph  ║ 0   ║ 
║ 34  ║ Fredrick ║ 117  ║ 
║ 117  ║ Jinan  ║ 34   ║ 
║ 122  ║ Verena  ║ 0   ║ 
║ 65  ║ Mary  ║ 199  ║ 
╚═══════════╩═════════════╩════════════╝ 

Wo 0 Werte in Partner_ID Spalte zeigt an, dass er/sie Single ist.

Wir müssen wiederholen oder Duplizierung partnered Personen angezeigt werden, ohne, sollte das gewünschte Ergebnis wie folgt aussehen:

╔═════════════╦══════════════╗ 
║ Person_Name ║ Partner_Name ║ 
╠═════════════╬══════════════╬ 
║ John  ║ Ruby  ║ 
║ George  ║ Mary  ║ 
║ Fredrick ║ Jinan  ║ 
╚═════════════╩══════════════╝ 

was ist die beste SQL-Abfrage, die die obigen Ergebnisse zurückgibt?

Ich verwende diesen Code:

SELECT  
    t1.Name, t2.Name   
FROM My_Tabel t1 
INNER JOIN My_Tabel t2 ON (t2.ID = t1.Partner_ID) 

aber das zurückgegebene Ergebnis ist:

╔═════════════╦══════════════╗ 
║ Person_Name ║ Partner_Name ║ 
╠═════════════╬══════════════╬ 
║ John  ║ Ruby  ║ 
║ Ruby  ║ John  ║ 
║ George  ║ Mary  ║ 
║ Mary  ║ George  ║ 
║ Fredrick ║ Jinan  ║ 
║ Jinan  ║ Fredrick ║ 
╚═════════════╩══════════════╝ 

wie die SQL-Anweisung aktualisiert werden soll (oder durch eine andere ersetzt), um die gewünschten Ergebnisse zu erhalten ?

+1

Was [RDBMS] (https://en.wikipedia.org/wiki/Relational_database_management_system)? –

+0

SQL Server @MaciejLos –

Antwort

1

Fügen Sie einfach einen Zustand einer Seite jedes Paar zu bekommen:

SELECT t1.Name, t2.Name   
FROM My_Table t1 INNER JOIN 
    My_Table t2 
    ON (t2.ID = t1.Partner_ID) 
WHERE t1.ID < t2.ID; 
+0

Vielen Dank, ich bin noch ein Anfänger :) Könnten Sie bitte kurz erklären, was sich in der Logik der Anweisung geändert hat, wenn Sie die Bedingung hinzufügen: 'WHERE t1.ID

+0

@EzzedeenSaghier . . . Sie wollen keine Wiederholungen, also werden die Ergebnisse so geordnet, dass 't1.id' immer kleiner ist als' t2.id'. Das bedeutet, dass Sie nicht zuerst den größeren Wert erhalten. –

Verwandte Themen