2012-07-03 2 views
2

두 개의 테이블이 있습니다. 하나는 ID < -> 이름 매핑을 포함하고 다른 테이블은 둘 이상의 ID 열을 포함합니다. ID의 해당 이름을 가진 두 번째 테이블의 기록을 나열하려면, 나는오라클이 여러 행을 결합합니다.

SELECT 
(SELECT NAME FROM TAB2 WHERE ID = ID1), 
(SELECT NAME FROM TAB2 WHERE ID = ID2), 
. 
. 
. 
FROM TAB1 

같은 쿼리이 그것을 할 수있는 유일한 방법겠습니까했습니다? 두 번째 테이블은 모든 행에 대해 모든 ID 열에 대해 쿼리됩니다.

+3

두 테이블 구조를 모두 표시하고 필요한 결과를 쿼리에 설명합니다. – manurajhada

+1

나에게 잘 어울립니다. ID가 다를 수 있기 때문에 검색어를 여러 번 사용해야하지만 여러 개의 조회가 필요합니다. – Andomar

답변

2

당신은이 방법을 시도 할 수 있습니다 :

select t1.* 
from Table1 t1 
join Table2 t2 on t1.id=t2.id1 OR t1.id=t2.id2 OR t1.id=t2.id3 

의 식별자 중 하나가 반환됩니다 Table1의 일치하는지 Table2 등의 행이 존재하는 Table1의 각 행. 옵션으로

+0

OP의 쿼리를 기반으로 여러 ID 열이있는 'Table1'이고 룩업 테이블 인 'Table2'가 있지만 아이디어는 분명해야합니다. 수치 스러운데이 쿼리는 같은 결과를 반환하지 않습니다. –

0

, 당신은 다음과 같이 쿼리를 다시 작성 시도 할 수 :

거의 효율성의 관점에서 어떤 차이를 만들 것,하지만 적어도 주관적이다 (쿼리를 읽기 쉽게 만들 수
SELECT 
b1.NAME, 
b2.NAME, 
. 
. 
. 
FROM TAB1 a 
INNER JOIN TAB2 b1 ON a.ID1 = b1.ID 
INNER JOIN TAB2 b2 ON a.ID1 = b1.ID 
... 

, 당연하지).

고려해야 할 또 다른 옵션이있을 수 있지만 확실하지 않은 두 가지 큰 IF가 있습니다. 귀하의 상황에 적용 가능하고 더 효율적일 경우.

첫 번째 것은 TAB1에있는 키의 존재 여부에 달려 있습니다. 전용 키 열이 없으면 (ID1, IF2, ... IDN)의 모든 조합이 고유 한 것으로 보장되면 충분합니다. 그리고이 방법이 복수 조회보다 더 효율적인지 여부는 IDx 열의 수에 따라 다릅니다.

아이디어는 @dasblinkenlight's answer에있는 것과 유사한 조건으로 두 테이블을 한 번만 조인 한 다음 키 열로 그룹화하고 조건부 집계를 사용하여 이름을 가져 오는 것입니다. 의미는 다음과 같습니다.

SELECT 
    MAX(CASE TAB2.ID WHEN TAB1.ID1 THEN TAB2.NAME END) AS NAME1, 
    MAX(CASE TAB2.ID WHEN TAB1.ID2 THEN TAB2.NAME END) AS NAME2, 
    . 
    . 
    . 
FROM TAB1 
INNER JOIN TAB2 ON TAB2.ID IN (TAB1.ID1, TAB1.ID2, ...) 
GROUP BY TAB1.ID1, TAB1.ID2, ... 
관련 문제