从包含互惠关系的表中提取唯一对

wit*_*ess 0 sql t-sql sql-server-2005

考虑一个SQL Server 2005数据库,其中包含很多人的大量数据,其中很大一部分已经结婚.为了跟踪人与人之间的关系,存在一个关系表,用于将一个人的ID与另一个人的ID相关联.每个关系记录上的关系类型用于指示两个人之间存在的关系类型(duh):"已婚","是儿子","是"的女儿,等等.

对于已婚人士,表中有两个关系记录 - 一个显示人A与人B结婚,另一个记录显示人B与人A结婚.对于婚姻,虽然在数据库中存在一些未经回复的记录,但是没有两个记录将被视为错误.(这是一种继承的设计,我没有改变这种方法的自由.)

RelID  Person1  Person2  RelationshipType
-----------------------------------------
1      1001     1010     Married           //Reciprocated by RelID 4
2      1002     1011     Married           //Reciprocated by RelID 5
3      1003     1012     Married           //Reciprocated by RelID 6
4      1010     1001     Married           //Reciprocated by RelID 1
5      1011     1002     Married           //Reciprocated by RelID 2
6      1012     1003     Married           //Reciprocated by RelID 3
7      1004     1013     Married           //Not properly reciprocated
Run Code Online (Sandbox Code Playgroud)

我需要做的是从表中提取独特的已婚夫妇.

我创建了一个名为GetOrderedPair(val1,val2)的函数,它接受2个Person ID并按顺序返回两个值的逗号分隔字符串值.这样,它总是返回相同的字符串值,无论我是否获得,参考上面的示例数据,来自记录的Person1和Person2,其中RelID为1或RelID为4(往复记录对).

我不禁想到有一种更好的方式让我望而却步.使用这个功能是最好的方法吗?你还能推荐什么?

当然,谢谢你提前.:-)

Eri*_*ric 6

由于你已经封装了GetOrderPair,我不知道它背后的逻辑,但我至少会告诉你我做了什么:

select distinct
    case when Person1 > Person2 then Person2 else Person1 end as Person1,
    case when Person1 > Person2 then Person1 else Person2 end as Person2
from
    couples
where
    relationshiptype = 'Married'
Run Code Online (Sandbox Code Playgroud)

也许有人比我做得更好.