리터럴을 결과에 어떻게 적용하여 행을 생성하기 위해 어떤 테이블을 결합한지에 따라 SQL 결과 세트를 어떻게 배치합니까?

StackOverflow https://stackoverflow.com/questions/1751647

  •  20-09-2019
  •  | 
  •  

문제

ID 열이있는 "슈퍼 타입"을 나타내는 3 개의 테이블이 있습니다. 다른 두 테이블은 각각의 하위 유형이며, SuperType 테이블의 외래 키 인 ID 열과 하위 유형 특이 적 열이 있습니다.

모든 데이터를 반환하는 쿼리와 행이 어떤 테이블에서 왔는지 알려주는 판별 자로 사용할 수있는 열을 원합니다.

예를 들어, 이것을 어떻게 수정할 수 있습니까?

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

다음과 같이 하드 코딩 된 문자 값이있는 판별 기 열을 추가 할 수있는 내용으로.

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

어떤 식 으로든 데이터 모델을 수정할 수 없습니다. 또한 사실 후 널을 프로그래밍 방식으로 테스트하여 사후 처리를 할 수 없습니다. 그대로 테이블로 작업하고 위에 표시된 정확한 결과 세트를 생성해야합니다. Oracle 11G를 사용하고 있습니다. 그렇다면 답변에 차이가 있습니다.

도움이 되었습니까?

해결책

추가 할 수 있습니다 :

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

당신의 시작시 SELECT 절.

다른 팁

어쩌면 이것이 당신이 찾고있는 것일 수도 있습니다 ... Oracle에서 작동하기 위해 몇 가지 변경을해야 할 수도 있습니다.

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

나는 보통 Union Query로 이것을합니다

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

합류하기 전에 각 테이블의 데이터에 식별자를 하위 쿼리로 추가 할 것입니다.

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top