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(往复记录对).
我不禁想到有一种更好的方式让我望而却步.使用这个功能是最好的方法吗?你还能推荐什么?
当然,谢谢你提前.:-)
由于你已经封装了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)
也许有人比我做得更好.