2017-12-15 1 views
1

두 개의 테이블, 작업 및 사용자가 있는데 일부 레코드를 모으려고합니다. 작업은 사용자 및 사용자와 조인해야합니다. 구조는 다음과 같습니다.SQL 자체 조인 + 다른 조인 작동하지 않음

JobID | OwnerID | ClientName 
    1 | 1 | Corey 
----------------------------- 
UserID | ManagerID | Name | Email 
    1 |  2  | Jon Smith | [email protected] 
    2 |   | Jane Doe | [email protected] 

사용자의 이름과 관리자의 전자 메일 주소가 포함 된 테이블을 얻으려고합니다.

SELECT 
     Job.ClientName as 'ClientName', 
     U1.Name as 'SalesPersonName', 
     U2.Email as 'ManagerEmail' 
    FROM 
     Job 
    INNER JOIN User U1 ON Job.OwnerID = U1.UserID 
    INNER JOIN User U2 ON U1.UserID = U2.ManagerID 
    WHERE 
     Job.ID = '1' 

이 모든 작업 데이터, U1에 대한 모든 데이터를 가져옵니다 ...하지만 U2를 채우는 데 실패 - 관리자의 정보를 : 내 쿼리입니다.

나는 자기 조인으로 뭔가 엉망이됐다고 상상한다. 쿼리가 유효한지, 그래서 나는 그것이 무엇인지를 놓치고 있습니다.

모든 안내를 크게 듣습니다.

참고 : 위의 표/열 이름은 무고한 사람을 보호하기 위해 단순화되었습니다.

답변

1
당신이 당신의 마지막 JOIN의 필드에 테이블 별칭을 나란히처럼 보이는

:

이 : FULL JOIN User U2 ON U1.UserID = U2.ManagerID

이되어야한다 FULL JOIN User U2 ON U2.UserID = U1.ManagerID

전체 쿼리

SELECT 
    Job.ClientName as 'ClientName', 
    U1.Name as 'SalesPersonName', 
    U2.Email as 'ManagerEmail' 
FROM 
    Job 
FULL JOIN User U1 ON Job.OwnerID = U1.UserID 
FULL JOIN User U2 ON U2.UserID = U1.ManagerID 
WHERE 
    Job.ID = 1 --removed ticks here, assuming int column 

주 : tog에 참여하지 않는 레코드가 없으면 FULL JOIN이 필요하지 않습니다. ether이고 결과 세트에 NULL 값을 가진 레코드를 보존하려고합니다. 제공되는 예를 들어, 기본 INNER JOIN 작동,하지만 어쩌면 당신은 내가 그것을 왼쪽 설정 당신의 진정한 데이터에 대한 FULL JOIN 필요

(주 2). user 많은 DBMS에서 예약어이며, 사용하는 경우 두통을 일으킬 수 tablename로

+0

내 부분에 어리석은 실수. 그것은 당신을 괴롭히는 작은 것들을 놀라게합니다. 나를 찾아 주셔서 감사합니다! – Corey

+0

@ 코리 (Corey) 좋은 코딩 노력은 어리석은 물건을 잡으려고 어깨를 들여다 볼 사람이 필요합니다. :) –