2009-06-02 13 views
0

を含む表からユニークなペアを抽出し、多くの人にデータの束を持つデータベースの大きな塊がと結婚しているSQL Server 2005のを考えてみましょう。人物間の関係を追跡するために、関係テーブルが存在し、1人のIDと別の人物のIDをリンクさせます。 A 各リレーションシップレコードの関係タイプは、問題の2人の人々(duh)の間に存在する関係の種類を示します。「結婚しました」、「息子です」、「息子です」、「娘です」などは相互関係に

結婚した人にとって、テーブルには2つの関係レコードがあります.1つは、Person-AがPerson-Bと結婚していることを示すレコードと、Person-BがPerson-Aと結婚していることを示す別のレコードです。結婚の場合、両方のレコードを持たないというエラーが考えられますが、DBには往復しないレコードがいくつかあります。 (これは継承され、設計であり、私はこのアプローチを変更する自由を持っていません。)

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 

私は何をする必要があることは、テーブルからユニークな夫婦を抽出しています。

I関数を作成し、2つのIDを取得し、順番に両方の値のカンマ区切り文字列値を返しGetOrderedPair(VAL1、VAL2)と呼ばれます。この方法では、上記の例のデータを参照して、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

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

関連する問題