Sql查询具有不同生效开始日期的重复列
我有一个表x_person和x_person_name。结构如下:Sql查询具有不同生效开始日期的重复列,sql,oracle,Sql,Oracle,我有一个表x_person和x_person_name。结构如下: x_person eff_start_date eff_end_date person_number 01-jan-1990 31-dec-4712 2 01-feb-1990 31-dec-4712 2 01-jan-1990 31-dec-4712 1 x_person_name eff_start_date eff_end_date person_nu
x_person
eff_start_date eff_end_date person_number
01-jan-1990 31-dec-4712 2
01-feb-1990 31-dec-4712 2
01-jan-1990 31-dec-4712 1
x_person_name
eff_start_date eff_end_date person_number name
01-jan-1990 31-dec-4712 2 freida
01-feb-1990 31-dec-4712 2 sam
01-jan-1990 31-dec-4712 1 isha
现在,我想在这两个表中检查相同员工的有效开始日期是否相同。对于那些不知道的人,我创建了一个查询
select * from
(
select distinct min(x.Effective_Start_Date) over(partition by x.person_number) Effective_Start_Date_name, y.Effective_Start_Date,x.person_number
from x_person_name x,x_person y where
x.person_number=y.person_number
)
where Effective_Start_Date_name <> Effective_Start_Date;
但是这不应该出现。假设您需要来自
x\u person
的行与x\u person\u name
不匹配,这可能会有帮助:
select *
from x_person p
left outer join x_person_name pn
ON (
p.person_number = pn.person_number and
p.eff_start_date = pn.eff_start_date
)
where pn.person_number is null
我想你在找一种叫做“反加入”的东西。仅重新运行表1中表2中没有行的行 如果我能很好地理解,对于您的示例数据,您应该没有返回行,对吗?您希望得到什么输出?您当前的输出是什么?@Utsav-我已经编辑了我的anser pls cehck
select *
from x_person p
left outer join x_person_name pn
ON (
p.person_number = pn.person_number and
p.eff_start_date = pn.eff_start_date
)
where pn.person_number is null
with x_perosn(eff_start_date, eff_end_date, person_number)
as (select to_date('01-jan-1990'), to_date('31-dec-4712'), 2 from dual
union all
select to_date('01-feb-1990'), to_date('31-dec-4712'), 2 from dual
union all
select to_date('01-jan-1990'), to_date('31-dec-4712'), 1 from dual)
, x_person_name(eff_start_date
, eff_end_date
, person_number
, name)
as (select to_date('01-jan-1990'), to_date('31-dec-4712'), 2, 'freida' from dual
union all
select to_date('01-feb-1990'), to_date('31-dec-4712'), 2, 'sam' from dual
union all
select to_date('01-jan-1990'), to_date('31-dec-4712'), 1, 'isha' from dual)
select * from (
select min(eff_start_date) over( partition by person_number) ed,y.* from x_person_name y
) t1 where not exists (select 1 from x_perosn where person_number= t1.person_number and ed = eff_start_date)