Sql查询具有不同生效开始日期的重复列

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和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_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)