2016-07-12 59 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'。这意味着你不会首先获得更大的价值。 –