2016-10-06 4 views
-2

여러 테이블이 있고 ID/Member/Type/UseDefault 열이 하나 있습니다. 다른 테이블에는 ID를 기반으로 한 사람에 대한 설명 정보가있는 열이 있습니다.case 문을 사용하여 다른 테이블의 데이터를 기반으로 데이터 표시

유형은 대부분 기본입니다. 어떤 경우에는 ID에 해당하는 정보가 완벽합니다. UseDefault가 false 인 경우 (이는 유형 IS가 기본이 아니며 기본값을 사용하지 않으려는 경우에만 발생 함) 제공된 ID도 완벽하게 적합합니다. 그러나 type이 기본값이 아니고 default를 Yes로 입력하면 같은 구성원의 기본 ID와 관련된 정보를 표시해야합니다. 예를 들어

:

ID Member Type UseDefault 

    1 joe default Y 
    2 joe additional Y 
    3 joe third  N 

당신이 행 1 ... 볼 수 있듯이 예, 사용의 기본은 예이지만, 형식은 이미 기본값입니다. 3 행에서

는, 사용의 기본값은 NO입니다, 그래서 당신은 ID를 계속 3.

그러나 연속 2. 기본은 '예, 그리고 유형이 기본되지 않은, 그래서 우리가 행을 찾을 필요 Joe의 기본 유형. 여기에 다른 테이블과 내 쿼리의 예상 출력이 있습니다.

정보

ID Car  Color Food 

    1 Benz Red Pizza 
    2 Ferrari Green Cheese 
    3 Minivan Orange Hamburger 

expected output: 

Output 

ID Car  Color Food 

    1 Benz Red Pizza 
    1 Benz Red Pizza 
    3 Minivan Orange Hamburger 

은 기본적으로 내가

declare 
id varchar2(2000) 

Select I.Car, I.Color, I.FavoriteFood 
from Info I 
full outer join Example e on e.id = i.id 
where case id:= when (e.useDefault = 'N' AND e.Type <> 'Default') then (select id from example where e.name = name and e.type = default) else e.type end 
and i.id = @id; 
+0

는 회원 ID로 '조'가 회원에 대한 고유 식별자되어 있나요? 그렇지 않으면 어떤 'joe'행이 서로 관련이 있는지, 다른 Joe 행의 행은 어떻게 알 수 있습니까? – mathguy

+0

거기에 다른 이름이있을 것입니다, 내가 그 부분을 포함하는 이유는 기본 및 다른 값뿐만 아니라 기본값으로 제임스 steve있을 것입니다 –

+0

당신은 내 질문을 이해하지 못했습니다. 조 브라운과 조 힐이 있을까요? 어떤 조 (어느 배)가 어느 조와 어울리는 지 어떻게 알 수 있니? Joe와 다른 Joe를 구별하기 위해 member_id에 대한 다른 열도 있습니까? – mathguy

답변

1
with 
    inputs (id, member, type, usedefault) as (
     select 1, 'joe', 'default' , 'Y' from dual union all 
     select 2, 'joe', 'additional', 'Y' from dual union all 
     select 3, 'joe', 'third'  , 'N' from dual 
    ), 
    info (id, car, color, food) as (
     select 1, 'Benz' , 'Red' , 'Pizza'  from dual union all 
     select 2, 'Ferrari', 'Green' , 'Cheese' from dual union all 
     select 3, 'Minivan', 'Orange', 'Hamburger' from dual 
    ), 
    defaults (id, member) as (
     select id, member 
     from inputs 
     where type = 'default' 
    ), 
    prep (id_to_use) as (
     select case when i.usedefault = 'N' then i.id 
        else d.id end as id_to_use 
     from inputs i inner join defaults d on i.member = d.member 
    ) 
select p.id_to_use as id, i.car, i.color, i.food 
from prep p left outer join info i on p.id_to_use = i.id 
;