SQL在特殊SQL中获取多行

时间:2018-12-28 10:44:53

标签: sql oracle

我有一个表abc,其中包含以下行:

emp_id_role     Group_name              Role_name       Location_id
 12              Insurance              Manager            Noida
 12              Insurance              Senior Manager     Noida
 13       Global Client Services            Sw               UP
 14       Operations Management         All Jobs           kERALA

和另一个具有所有详细信息employee_xyz的主表:

PERSON_ID   NAME        DOB     START_DATE      END_DATE        SSN
  12        DEAN    01-JAN-1990 01-JAN-2017     20-JAN-2017     847474
  12        DEAN    01-JAN-1990 21-JAN-2017     03-mar-2018     847474
  12        DEAN    01-JAN-1990 04-mar2018      31-DEC-4712     847474
  13        SAM     20-JAN-1990 17-JAN-2016     20-JAN-2017     847474
  13        SAM     20-JAN-1990 21-JAN-2017     31-DEC-4712     847474
  14        JAY     29-dec-1990 21-JAN-2016     31-DEC-4712     847474

我想从表employee_xyz中获取表abc中记录的全名。

当我使用以下查询将这两者结合时,我得到的雇员行数比表abc中的行数多,

例如:对于employee_id 12,我应该像表abc那样得到2行,但是我却以某种方式得到9行...

使用的查询很简单:

select * from table_abc abc,
employee_xyz xyz
where xyz.person_id=abc.emp_id_role
and trunc(sysdate) between abc.Start_date and xyz.end_date
and person_id=12;

1 个答案:

答案 0 :(得分:0)

我想您要从table_abc中选择所有名称为employee_xyz的列。

如果您尝试使用select abc.*, xyz.name,则由于 person_id = 12 sysdate仅停留在第三行的间隔中,因此您已经可以选择两行了( start_date:04-mar2018 / end_date:31-DEC-4712 ),但如果您希望保留更多日期值而不重复,则可以使用以下不同的select distinct abc.*, xyz.name将第二行的结束日期中的两行从'2018-03-03'转换为'2019-03-03'):

with table_abc(emp_id_role, Group_name, Role_name, Location_id) as
(
 select 12,'Insurance','Manager','Noida' from dual union all
 select 12,'Insurance','Senior Manager','Noida' from dual union all
 select 13,'Global Client Services','Sw', 'UP' from dual union all
 select 14,'Operations Management','All Jobs','kERALA' from dual
),
    employee_xyz(person_id,name, dob, start_date, end_date, ssn) as
(
 select 12,'DEAN',date'1990-01-01',date'2017-01-01',date'2017-01-20',847474 from dual union all        
 select 12,'DEAN',date'1990-01-01',date'2017-01-21',date'2019-03-03',847474 from dual union all        
 select 12,'DEAN',date'1990-01-01',date'2018-03-04',date'4712-12-31',847474 from dual      
)
select distinct abc.*, xyz.name
  from table_abc abc join employee_xyz xyz
    on xyz.person_id = abc.emp_id_role
 where trunc(sysdate) between xyz.Start_date and xyz.end_date
   and person_id = 12;

EMP_ID_ROLE GROUP_NAME  ROLE_NAME         LOCATION_ID  NAME
----------- ----------  ---------------  -----------   -----
12          Insurance   Manager           Noida        DEAN
12          Insurance   Senior Manager    Noida        DEAN