2009-06-02 4 views
0

결혼있는 큰 덩어리 그들 중 많은 사람들이 데이터의 무리와 함께 SQL Server 2005의 데이터베이스를 생각해 보자. 사람 간 관계를 추적하려면 관계 테이블이 존재합니다.이 테이블은 한 사람의 ID를 다른 사람의 ID와 연결시키는 역할을합니다. A 각 관계 기록에있는 관계 유형은 두 명의 사람들 사이에 존재하는 관계의 유형을 나타냅니다. "결혼했습니다", "아들입니다", "딸입니다"등추출 고유 쌍은

결혼 한 사람의 경우 두 개의 관계 기록이 테이블에 있습니다. 하나는 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 

내가 뭘해야 테이블에서 고유 한 부부를 추출합니다.

GetOrderedPair 2 개 인 ID를 취하여 순차적으로 두 값의 쉼표로 구분 된 문자열 값을 리턴 (VAL1, val2만큼)라는 함수를 만들었다. 이 방법은 위의 예제 데이터 인 Person1과 Person2를 RelID가 1 또는 RelID가 4 인 레코드 (reciprocating record of records)에서 가져 오는 것과 관계없이 항상 동일한 문자열 값을 반환합니다.

저는 더 나은 방법이 있다고 생각합니다. 이 기능의 사용이 가장 좋은 방법입니까? 그 밖의 무엇을 권할만한가요?

감사합니다. 물론 사전에. :-)

답변

6

, 나는 아무 생각을 뒤에 논리가 없다,하지만 난 적어도 내가 무엇을 줄 것이다 :

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" 

이 당신이 찾고있는 물건의 종류 : 일반적으로, 부부의 목록을 가져 오기 위해,이 같은 간단한 쿼리를 할 것인가? 당신이 GetOrderPair을 캡슐화 한 이후

+0

나는 이것을 좋아하지만, 'unreciprocated'레코드를 발견했을 때 작동하지 않을 것이고 p1.PersonID는 p2.PersonID보다 큽니다. – witttness