所以我一直有這個問題一段時間了,我需要連接兩個表,但我沒有唯一的標識符,所以我必須使用ID和日期範圍。如果兩個日期範圍重疊,我需要加入第一個值。我需要成爲一個外連接。我現在的代碼在理論上是正確的,但它不適合這種情況(我不能讓這個連接成爲外連接,因爲我這樣得到一個錯誤)。SQL如何在不使用嵌套子查詢的情況下外連接第一個匹配值
邏輯如下:員工可以是外籍員工。如果他是外籍人士,我需要顯示所有專欄。但棘手的部分 - 如果在分配期間(在effective_start_date和effective_end_date之間)他在2個不同的國家,我只需要顯示關於最後一趟的信息。 最後一部分(關於只加入MAX(valid_to需要調整)) - 這樣,有唯一的assign_id,effetive_start_date,effective_end date(所以這個表正確地加入到其他表)組合。我知道這可以修復一個單一的連接,我只是不知道如何(我可以做到這一點,而不使用任何嵌套的子查詢)。
請給我提供ORACLE語法,是的,我知道有人說這已經過時了,但是這段代碼絕對需要現在編寫的語法+它對我來說更容易理解。
with assignments (assignment_id, person_id, effective_start_date, effective_end_date) as (
select 456, 123, date '2015-01-01', date '2015-03-15' from dual union all
select 456, 123, date '2015-03-16', date '4712-12-31' from dual union all
select 975, 123, date '2015-03-16', date '4712-12-31' from dual union all
select 674, 145, date '2015-03-16', date '4712-12-31' from dual
),
expatriates (person_id, home_country, host_country, date_from, date_to, valid_from, valid_to)
as
(
select 123, 'TEST2', 'TEST2', date '2015-01-01', date '2015-03-15', date '2015-01-01', date '2015-03-15' from dual union all
select 123, 'TEST1', 'TEST1', date '2015-04-16', date '2016-06-15', date '2015-04-16', date '2016-06-15' from dual union all
select 123, 'TEST', 'TEST', date '2015-03-16', date '2016-04-15', date '2015-03-16', date '2015-04-15' from dual
)
select
a.assignment_id,
a.person_id,
a.effective_start_date,
a.effective_end_date,
subq.home_country,
subq.host_country,
subq.date_from,
subq.date_to
from assignments a, expatriates subq
where
a.person_id=subq.person_id(+)
and subq.valid_from(+) <= a.effective_end_date
and subq.valid_to(+) >= a.effective_start_date
and subq.date_from(+) =
(
select
max(date_from)
from expatriates sq2
where
sq2.person_id = a.person_id and
sq2.valid_from <= a.effective_end_date and
sq2.valid_to >= a.effective_start_date
)
使用正確的'left join'運算符也是「Oracle語法」 - 甚至Oracle建議停止使用舊的(+)'運算符。 –
你是說你提出的查詢給出了正確的結果,但是你想要一個在WHERE子句中不使用子查詢的替代方案嗎? –
您的查詢只選擇完全屬於任務期限的外派日期範圍。您是否也需要考慮範圍重疊的情況,但分配範圍並未完全包含外派範圍? –