从自引用表中选择唯一值

时间:2016-07-12 12:51:59

标签: sql sql-server

假设我们在名为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 个答案:

答案 0 :(得分: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;