2016-07-12 61 views
1

假設我們有一個名爲My_Tabel表中的以下數據:選擇從自引用表唯一值

╔═══════════╦═════════════╦════════════╗ 
║ 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  ║ 
╚═══════════╩═════════════╩════════════╝ 

凡PARTNER_ID列0值表明他/她是單身。

我們需要在不重複或複製到顯示的人結成夥伴,期望的結果應該是這樣的:

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

什麼是最好的SQL查詢,返回上面的結果?

我使用這個代碼:

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

但它返回的結果是:

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

的SQL語句應該如何更新(或與其他替代),以獲得期望的結果?

+1

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

+0

SQL Server @MaciejLos –

回答

1

只需添加一個條件,讓每對的一面:

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

非常感謝,我仍然是初學者:)請您簡單介紹添加條件時語句邏輯中發生了什麼變化:'WHERE t1.ID

+0

@EzzedeenSaghier 。 。 。你不需要重複,所以這個命令的結果是't1.id'總是小於't2.id'。這意味着你不會首先獲得更大的價值。 –