2009-11-17 1 views
2

나는 3 개의 테이블을 가지고 있는데 하나는 ID 컬럼을 가진 "슈퍼 타입"을 나타낸다. 두 개의 다른 테이블은 상위 유형에 대한 외래 키인 ID 컬럼과 부속 유형별 컬럼이있는 각 부속 유형입니다.어떻게 행을 만들기 위해 어떤 테이블을 조인했는지에 따라 SQL 결과 집합에 결과로 리터럴을 넣으시겠습니까?

모든 데이터를 반환하는 쿼리뿐만 아니라 행이 어떤 테이블에서 왔는지 알려주는 식별자를 사용할 수있는 열이 필요합니다.

따라서, 예를 들어, 내가 어떻게 이것을 수정할 수 있습니다

SELECT * from SUPER S 
left outer join SUB_1 S1 on S.ID = S1.ID 
left outer join SUB_2 S2 on S.ID = S2.ID 

을 나에게 돌려주는이 :

일부 하드 코딩 리터럴 값으로 판별 자 컬럼을 추가 할 것입니다 무언가로

ID SUB_COL_1 SUB_COL_2 
==== ========= ========= 
0001 value x NULL 
0002 value y NULL 
0003 NULL  value z 
, like :

ID DISCRIMINATOR SUB_COL_1 SUB_COL_2 
==== ============= ========= ========= 
0001 SUBTYPE_1  value x NULL 
0002 SUBTYPE_1  value y NULL 
0003 SUBTYPE_2  NULL  value z 

어떤 방식 으로든 데이터 모델을 수정할 수 없습니다. 사실 후에도 NULL을 프로그래밍 방식으로 테스트하여 어떤 후 처리도 수행 할 수 없습니다. 나는 테이블을 그대로 사용하고 위에 나온 정확한 결과 세트를 만들어야합니다. 나는 Oracle 11g를 사용하고 있습니다.

답변

4

당신은 추가 할 수 있습니다

CASE IF S1.ID IS NULL THEN 'SUBTYPE_1' ELSE 'SUBTYPE_2' END AS DISCRIMINATOR, 

당신의 SELECT 조항의 시작.

+0

매력처럼 작동합니다. 감사! –

+0

@ 케빈, 항상 도와 드리겠습니다! –

1

어쩌면 이것이 사용자가 찾고있는 것일 수 있습니다. 오라클에서 작동하게하려면 몇 가지 사항을 변경해야 할 수 있습니다.

SELECT case coalesce(SUB_COL_1,'') when '' then 'SUBTYPE_2' else 'SUBTYPE_1' end, * from SUPER S 
left outer join SUB_1 S1 on S.ID = S1.ID 
left outer join SUB_2 S2 on S.ID = S2.ID 
1

나는 보통 UNION 쿼리

Select S.ID, SUBTYPE_1 as DISCRIMINATOR, S1field1 as SUB_COL_1, null as SUB_COL_2 
from SUPER S 
join SUB_1 S1 on S.ID = S1.ID 
union all 
Select S.ID, SUBTYPE_2 as DISCRIMINATOR, null as SUB_COL_1, S2.field1 as SUB_COL_2 
from SUPER S 
join SUB_2 S2 on S.ID = S2.ID 
1

아마 그것을 결합하기 전에 하위 쿼리에서 각 테이블의 데이터에 식별자를 추가하는 것이 작업을 수행.

SELECT * from 
    (select *, 'SUPER' as DISCRIMINATOR from SUPER) S 
left outer join 
    (select *, 'SUBTYPE1' as DISCRIMINATOR from SUB_1) S1 
    on S.ID = S1.ID 
left outer join 
    (select *, 'SUBTYPE1' as DISCRIMINATOR from SUB_2) S2 
    on S.ID = S2.ID 
+0

가능하다면 서브 쿼리의 성능 저하를 피하려고합니다. –

+1

이것은 서브 쿼리가 아닌 인라인 뷰이며, 성능상의 문제는 기대하지 않습니다. –

관련 문제