2013-05-22 3 views
2

오늘 최종 시험이 있습니다. 나는 행복하게 찬성했다. 그러나 문제 중 하나가 내 마음을 정말로 부 풀리고있다.테이블에 대한 쿼리가 자체와 결합되었습니다.

도움이 필요하므로 안심할 수 있습니다.

인한 문제

우리는 테이블 "사람"이

(PK)id | name | fatherID 
    --------------------- 
    1 | gon | 2 
    2 | cesar| 6 
    3 | luz | 2 
    4 | maria| 5 
    5 | diego| 6 
    6 | john | - 

이 데이터의 예입니다. 이 테이블은 자신과 테이블 ID (PK)가있는 fatherId (FK)와의 관계가 있습니다. 사람의 이름에 2 개의 열을 표시하고 다른 하나에는 그의/사촌.

여기까지 아주 간단합니다. 문제는 제한이 있다는 것입니다.

  • ANSI 허용. 아니 T - SQL이나 다른 하나. 또한 ANSI 99 표준 (2003 또는 그 이상이 아님)
  • 하위 쿼트는 허용되지 않습니다. 그리고 최악의 경우 :
  • NO 관계가 반복됩니다.

예를 들어,이 예에서 gon과 maria는 사촌입니다. 결과에 gon | maria이 표시되면 maria | gon을 표시 할 수 없습니다.

그래, 내가 어떻게 할 수 있니? 정말 머리가 타오르는 중입니다.

나는 무엇을 시도 했습니까?

글쎄, 큰 문제는 마지막 요구 사항, 데이터의 반복에있었습니다. 나는 내 시험에서이를 넣어 무시 이번이 마지막 requeriment 해결되지 물론

select p3.name as OnePerson, p4.name as Cousin 
from 
people p1 
inner join people p2 on p1.fatherid = p2.fatherid and p1.id != p2.id 
inner join people p3 on p1.id = p3.fatherid 
inner join people p4 on p1.id = p4.fatherid 

(알고가 .. 잘못), 나는 어쨌든 테스트에서 4가 (우리가 4 패스)하지만, , 내 머리가 타오른다. 제발 도와주세요!

또 다른 옵션은 (*) 같은 시험을 한 내 친구의

하나,

는 "음, 모든 관계는 중복을 고려, 내가 최고 수를 사용할 수 있습니다 나에게 말했다 탐구 및 및 의한 주문은 TopANSI하지 않습니다 .. "

을 올바른 절반을 얻을 수 있지만!

답변

3

WHERE p3.id < p4.id에 쿼리를 추가 할 수 있습니다. 이렇게하면 gon | mariamaria | gon과 같은 중복 결과가 제거됩니다.

0

이렇게하면 원하는 형식으로 결과를 얻을 수 있습니다.

SELECT TAB1.ID,TAB2.ID 
FROM 
(
SELECT * FROM people T1 
WHERE fatherID IN (SEL T1.ID FROM people T1 INNER JOIN people T2 
ON( T1.id=T2.fatherID) WHERE T1.fatherID IS NOT NULL GROUP BY 1)) TAB1 

INNER JOIN 
(
SELECT * FROM people T1 
WHERE fatherID IN (SEL T1.ID FROM people T1 INNER JOIN people T2 
ON( T1.id=T2.fatherID)WHERE T1.fatherID IS NOT NULL GROUP BY 1)) TAB2 

ON(TAB1.fatherID<>TAB2.fatherID) 
GROUP BY 1,2 
WHERE TAB1.ID <TAB2.ID; 
0
SELECT T1.id , T2.id FROM 
(
    SELECT A.id,A.fid FROM family A 
    WHERE a.fid IN 
    ( 
     SELECT id FROM family 
     WHERE fid IN (SELECT id FROM family WHERE fid IS NULL) 
    ) 
)T1 

JOIN 
(
    SELECT A.id,A.fid FROM family A 
    WHERE a.fid IN 
    ( 
      SELECT id FROM family 
      WHERE fid IN (SELECT id FROM family WHERE fid IS NULL) 
    ) 
)T2 
ON t1.fid<>t2.fid 
AND t1.id<t2.id