2009-06-02 44 views
0

考慮在很多人的SQL Server 2005數據庫與一組數據,一大塊人是結婚。爲了跟蹤人與人之間的關係,存在Relationship表,其用於將一個人的ID鏈接到另一個人的ID。 A 關係類型在每個關係記錄上用於指示所討論的兩個人(duh)之間存在的關係類型:「已婚」,「是兒子」,「是女兒」等。提取唯一對

對於已婚人士,表格中有兩個關係記錄 - 一個顯示Person-A與Person-B結婚,另一個記錄顯示Person-B與Person-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 

我需要做的是從表格中提取獨特的已婚夫婦。

我創建了一個名爲GetOrderedPair(VAL1,val2)將這需要2個人ID和返回按順序的兩個值的逗號分隔的字符串值的功能。這樣,無論我是否參照上述示例數據,從RelID爲1或RelID爲4(往返對記錄)的記錄引用Person1和Person2,它總是返回相同的字符串值。

我不禁想到有一種更好的方法可以逃避我。使用這個功能是最好的方法嗎?你還可以推薦什麼?

謝謝,當然,提前。 :-)

回答

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' 

也許是得有人做這個比我更好的方法做。

+0

非常明顯。現在我很慚愧地問過這個問題。謝謝,埃裏克。 – witttness 2009-06-02 22:39:37

1

說實話,我並不完全明白你的問題是什麼。一般地,獲取的已婚夫婦的列表,你會做這樣一個簡單的查詢:

SELECT p1.*, p2.* 
FROM Person AS p1 
JOIN Relationship r ON p1.PersonID = r.Person1 AND r.RelationshipType = 'Married' 
JOIN Person AS p2 ON r.Person2 = p2.PersonID 
WHERE p1.PersonID < p2.PersonID --This would ensure that you only get each couple "once" 

,這就是你要尋找的那種東西?

+0

我喜歡這個,但是當我遇到'unreciprocated'記錄並且p1.PersonID大於p2.PersonID時,它不起作用。 – witttness 2009-06-02 22:32:49