您可以使用analytic functions要做到這一點,其優點是隻能擊中每張桌子一次。
select distinct a.login_id,
case when b.login_id is null then null
when first_value(b.status) over (partition by b.login_id
order by b.status nulls first) is null then b.resign_date
when first_value(b.status) over (partition by b.login_id
order by b.status nulls first) = 'Y' then date '2050-12-31'
end as resign_date,
case when b.login_id is null then null
when first_value(b.status) over (partition by b.login_id
order by b.status nulls first) is null then b.last_date
when first_value(b.status) over (partition by b.login_id
order by b.status nulls first) = 'Y' then date '2050-12-31'
end as last_date
from tablea a
left join tableb b on b.login_id = a.login_id
order by a.login_id;
相關部分是case
說法 - 有兩個,但它們是相同的,除了這是從TABLEB
返回列。該案有三個條款:
when b.login_id is null then null
如果在TABLEB
沒有匹配的記錄,因爲外部的,參加B.LOGIN_ID
將是無效的;這符合你的第三個標準。
when first_value(b.status) over (partition by b.login_id
order by b.status nulls first) is null then b.resign_date
的first_value()
函數返回「最低」的狀態值,nulls first
意味着,如果有任何的匹配TABLEB
記錄有一個空的狀態,這就是將第一次看到。所以這符合你的第一個標準,並且對該空狀態行使用TABLEB.RESIGN_DATE
。
when first_value(b.status) over (partition by b.login_id
order by b.status nulls first) = 'Y' then date '2050-12-31'
同以前的條款,但如果第一個值是Y
,那就不會有任何空,因爲nulls first
的這個時候再次。 (這是假設狀態只能是null
或'Y',你的問題暗示 - 如果有其他狀態,那麼行爲沒有在你的標準中指定)。因此,如果TABLEB
中的所有匹配行的狀態爲Y
,則會使用與您的第二個條件相匹配的固定日期值。
請注意,我在這裏使用了date literal;如果你願意,你可以使用to_date('12/31/2050', 'MM/DD/YYYY')
,但不要使用隱式轉換,並假定將使用特定的日期掩碼。
:系統將如何填充空條目的日期...它會是什麼日期?我在詢問第一個條件 –
如果多於一個的TABLEB行的狀態爲null會怎麼樣? –
@GauravSoni在這種情況下,我應該得到狀態爲空的條目的resign_date和last_date .. – Andromeda