【发布时间】:2015-08-31 17:41:04
【问题描述】:
我不明白如何只加入第一个匹配行。如果我通过 person_id 和日期的组合加入,查询将返回多个值。在这种情况下,如果连接返回多个值,我希望只显示此连接中的一行。预期结果 - assignment_id、effective_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
),
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
【问题讨论】:
-
读到“我只需要显示一行”就奇怪了,没有进一步的解释。您不想告诉我们在这种情况下选择哪一行吗?顺便说一句:您使用的连接语法已经过时了二十多年。您应该切换到显式连接(例如
from assignments a inner join expatriates subq on ...)。