2014-02-11 2 views
1

나는 파이어 버드에서이 같은 테이블이 있습니다어떤 SQL 절을 사용해야합니까?

Tablename: SERVICES 
+-----------+-----+-----+-----+ 
|serviceno |user1|user2|user3| 
+-----------+-----+-----+-----+ 
|v1   |  |1 |2 | 
+-----------+-----+-----+-----+ 
|v2   |3 |2 |  | 
+-----------+-----+-----+-----+ 
|v3   |5 |4 |  | 
+-----------+-----+-----+-----+ 
|v4   |3 |2 |1 | 
+-----------+-----+-----+-----+ 

내가 해봤

+-----------+-----+-----+-----+ 
    |serviceno |user1|user2|user3| 
    +-----------+-----+-----+-----+ 
    |v1   |  |a |b | 
    +-----------+-----+-----+-----+ 
    |v2   |c |b |  | 
    +-----------+-----+-----+-----+ 
    |v3   |e |d |  | 
    +-----------+-----+-----+-----+ 
    |v4   |c |b |a | 
    +-----------+-----+-----+-----+ 

로 해당 테이블을 원하는

Tablename: USERNAMES 


+--------+-----+ 
|username|code | 
+--------+-----+ 
|a  |1 | 
+--------+-----+ 
|b  |2 | 
+--------+-----+ 
|c  |3 | 
+--------+-----+ 
|d  |4 | 
+--------+-----+ 
|e  |5 | 
+--------+-----+ 

이 테이블을

SELECT IFF(A.USER1 = NULL,NULL,B.NAME), 
    IFF(A.USER2 = NULL,NULL,C.NAME), 
    IFF(A.USER3 = NULL,NULL,D.NAME) 
    FROM SERVICES A INNER JOIN USERNAMES B ON (A.USER1 =B.CODE) 
    INNER JOIN USERNAMES C ON (A.USER2 =C.CODE) 
    INNER JOIN USERNAMES D ON (A.USER3 =D.CODE) 

그리고 여러 시도가 있지만 항상 결과는 행 v4뿐입니다. 왜? 모든 행을 어떻게 얻을 수 있습니까?

답변

-1

에 내가 파이어 버드에 익숙하지 않은 해요,하지만 여기에 일반적인 SQL 솔루션입니다 것을 단순화 할 수 있습니다 :`의

select 
    serviceno, 
    (select username 
     from usernames 
     where services.user1 = usernames.code) as user1, 
    (select username 
     from usernames 
     where services.user2 = usernames.code) as user2, 
    (select username 
     from usernames 
     where services.user3 = usernames.code) as user3 
from 
    services 
+0

감사합니다 !!! 이것은 나에게 '모든 필드는 null 행'을 제공하는데, 이는 내가 필요로한다. – kudra

+2

상관 관계가있는 하위 쿼리는 일반적으로 성능 문제를 만드는 부적절한 기술입니다. 왼쪽 조인 솔루션이 더 나은 솔루션입니다. – HLGEM

4

당신은 OUTER JOINS 사용해야

SELECT serviceno, 
     IFF(A.USER1 = NULL,NULL,B.NAME), 
     IFF(A.USER2 = NULL,NULL,C.NAME), 
     IFF(A.USER3 = NULL,NULL,D.NAME) 
FROM SERVICES A 
     LEFT OUTER JOIN USERNAMES B ON (A.USER1 =B.CODE) 
     LEFT OUTER JOIN USERNAMES C ON (A.USER2 =C.CODE) 
     LEFT OUTER JOIN USERNAMES D ON (A.USER3 =D.CODE) 

는 내부가 일치하는 경우에만 결과를 반환 참여, 그 결과가 당신의 요구를하더라도 user1user2, 또는 user3가 null 행을 갖고 싶어하고, 그러므로 e와 일치하는 것이 없다. 지. AB.

그리고 당신은

SELECT serviceno, 
     B.NAME, 
     C.NAME, 
     D.NAME 
FROM SERVICES A 
     LEFT OUTER JOIN USERNAMES B ON (A.USER1 =B.CODE) 
     LEFT OUTER JOIN USERNAMES C ON (A.USER2 =C.CODE) 
     LEFT OUTER JOIN USERNAMES D ON (A.USER3 =D.CODE) 
+0

사용 IIF' 불필요한해야한다은 , 'USERx'가 null이면, 이미 NAME이 null임을 의미합니다. –

+0

@MarkRotteveel 맞습니다! 나는 오리지널 쿼리를 복사 했으므로 잘못된 것이 아니며 OP가 변경 사항을 인식하는 데 도움이되었지만 지금은 제안을 추가했습니다. – FrankPl

3
SELECT serviceno, u1.username as user1, u2.username as user2, u3.username as user3 FROM Services 
LEFT OUTER JOIN USERNAMES u1 ON user1 = u1.code 
LEFT OUTER JOIN USERNAMES u2 ON user2 = u2.code 
LEFT OUTER JOIN USERNAMES u3 ON user3 = u3.code