2010-08-23 6 views
0

내 DB 클래스에 대한 2 개의 쿼리에 문제가 있습니다.조건과 재귀가있는 SQL UNION

나는이 열이 하나의 테이블 "고객"이 : 다니엘가 그들로부터 모든 클라이언트 추천 및 추천을 표시 한 사람의 ID와 잭

1)에 의해 대해 참조 것을

name | id  | date  | points | REFERRAL 
--------------------------------------------- 
daniel | 123456 | 01-01-01 | 50  | 321321 
jack | 321321 | 01-01-01 | 30  | 555555 

주 세 번째 기준 레벨

먼저 난 그냥 2의 기준 레벨에 대한이 같은 뭔가 생각 :

SELECT C1.name 
FROM Clients C1, Clients C2 
WHERE C1.REFERRAL= 21000301 
     AND C1.id= C2.REFERRAL 

이것은 분명히 AND에서는 작동하지 않습니다. 는 그럼 난 UNION 시도 :

SELECT C1.id, C1.REFERRAL 
FROM Clients C1 
WHERE C1.REFERRAL= 21000301 

UNION 

SELECT C2.id, C2.REFERRAL 
FROM Clients C2 
WHERE C2.REFERRAL= C1.ID 

을하지만 그래서, 내 질문은 UNION과 조건을 만들 수있는 방법이있다

SELECT 두 번째에 C1에 액세스 할 수 없습니다. 그렇지 않은 경우 어떻게 해결할 수 있습니까?

2) 직접 추천과 간접 추천을 통해 추천 이름의 이름과 총 추천 수를 클라이언트에 표시하십시오.

나는 완전히 잃어 버렸습니다 : D, 재귀 적이 아닐까요? SQL에 그런 것이 있습니까?

사전에 감사 드리며 불쌍한 나의 가난한 영어.

답변

1

나는 그것을 알아낼 : D

select c.name 
from CLIENTS C 
where c.REFERRAL=21000301 OR c.REFERRAL 
    IN(SELECT c.id FROM CLIENTS C WHERE c.REFERRAL=21000301 OR c.REFERRAL 
    IN(SELECT c.id FROM CLIENTS C WHERE c.REFERRAL=21000301 OR c.REFERRAL 
    IN(SELECT c.id FROM CLIENTS C WHERE c.REFERRAL=21000301))) 
0

첫 번째 예제가 작동하지 않는 이유는 c1.referral = 21000301입니다. 그런 행이 없습니다. 당신이를 생략하면 쿼리가 작동합니다

SELECT C1.name 
FROM Clients C1, Clients C2 
WHERE C1.id = C2.REFERRAL 

또는 더 명확하게 재 작성을 두 수준에 가입 :

SELECT C1.name 
FROM Clients C1 
JOIN Clients C2 
ON  C1.id = C2.REFERRAL 
JOIN Clients C3 
ON  C2.id = C3.REFERRAL 

당신은 추천의 임의의 수준에 대한 재귀 쿼리를하기 만 것입니다. 재귀 쿼리 구문은 데이터베이스마다 다르므로 사용중인 데이터베이스를 알려줘야합니다.

+0

다음 대답 (코드는 여기 꼴), 난 당신이 날 도울 수 있기를 바랍니다를 참조하십시오. – danielfrg

1

메신저 사용 : c1.referral = 21000301 ID가 주어진 사람의 추천이 필요하며 그 ID는 테스트 용이므로 테이블에 있습니다.

나는이 시도 :

SELECT C1.name 
FROM Clients C1 
JOIN Clients C2 
ON  C1.id = C2.REFERRAL 
JOIN Clients C3 
ON  C2.id = C3.REFERRAL 
WHERE c1.referral = 21000301 

을하지만 하나의 이름 만 8 시간을 보여줍니다.

데이터베이스에 관해서는 잘 모르겠지만, 대학에서 호스팅을하고 있습니다. 도움이된다면 Oracle SQL Developer를 사용하고 있습니다. 어쨌든 어떤 코드라도 도움이 될 것 같아요.

감사합니다.

+0

c2.name과 c3.name도 선택하십시오. 추신 : 자신의 질문에 답변을 추가하는 대신 질문 자체를 수정하는 것을 고려해보십시오. – Andomar

+0

감사합니다. Oracle 10g를 사용하는 DB에 대해 두 번째 질문을 도와 줄 수 있기를 바랍니다. – danielfrg

+0

더 나은 오라클 태그가 새 질문에. 내가 연결하는 것 같아요,하지만 전문가가 더 말할 수 있습니다 :) – Andomar