SQL使用唯一行

时间:2016-10-14 08:46:14

标签: sql oracle join

我有两张桌子 表1

 - EMPLID XX_EMPLID GTN   DEDCD    EFFDT
     1     A1        102   XXYY     02-OCT-16
     1     A1        103   XXYZ     02-OCT-16

表2

  - EMPLID  DEDCD    EFFDT
     1       XXYA     02-OCT-16
     1       XXYZ     02-OCT-16

当我加入时,select应该只返回两行,输出应该是

 - EMPLID   2.DEDCD    EFFDT        1.DEDCD
     1       XXYA     02-OCT-16      XXYY
     1       XXYZ     02-OCT-16      XXYZ

EMPLID,EFFDT是关键。我不想加入DEDCD,因为我需要看看差异,如果有的话。请建议。

简单连接总会给我更多行。我希望将行限制为Table1中的行数。我试过"右外连接"和"左外连接"但是不起作用

经过一些帮助,我能够接近结果。但是,我面临的一个问题在下面指出

10008536    XXYZ    06-MAR-02   (XXYY)  06-MAR-02
10008536    (XXYY)  06-MAR-02   XXZZ    06-MAR-02

编辑3

虽然我设法解决了我之前的问题,但我还面临着另一个类似的问题。

两个表格,密钥结构为 EMPLID,EMPL_RCD,BALANCE_ID,BALANCE_YEAR,BALANCE_QTR,BALANCE_PERIOD,ERNCD

我编写了一个查询,使用SQL Below:

从两个表中获取值
SELECT EBPS.EMPLID ,EBPS.BALANCE_ID ,EBPS.BALANCE_YEAR ,EBPS.BALANCE_QTR ,EBPS.BALANCE_PERIOD ,
EBPS.ERNCD ,EBCS.EMPLID ,EBCS.BALANCE_ID ,EBCS.BALANCE_YEAR ,EBCS.BALANCE_QTR ,
EBCS.BALANCE_PERIOD ,EBCS.ERNCD   
FROM 
    (
  select  EBCS1.EMPLID ,EBCS1.COMPANY ,EBCS1.BALANCE_ID ,EBCS1.BALANCE_YEAR ,EBCS1.BALANCE_QTR ,
EBCS1.BALANCE_PERIOD ,EBCS1.EMPL_RCD ,EBCS1.SPCL_BALANCE ,EBCS1.ERNCD ,EBCS1.HRS_YTD ,EBCS1.HRS_QTD ,EBCS1.HRS_MTD ,
EBCS1.GRS_YTD ,EBCS1.GRS_QTD ,EBCS1.GRS_MTD ,EBCS1.XX_EMPLOYEE_ID,
         row_number() over (partition by EBCS1.EMPLID,EBCS1.EMPL_RCD order by case when EBPS1.EMPLID is not null then 0 else 1 end asc,
         EBCS1.BALANCE_YEAR,EBCS1.BALANCE_QTR,EBCS1.BALANCE_PERIOD,EBCS1.ERNCD ) rn
  from TABLE1 EBCS1 left join 
  (select distinct EMPLID,EMPL_RCD, COMPANY, BALANCE_ID,BALANCE_YEAR,BALANCE_QTR,BALANCE_PERIOD,ERNCD,SPCL_BALANCE from TABLE2) EBPS1 on 
  EBCS1.EMPLID=EBPS1.EMPLID AND EBCS1.BALANCE_ID=EBPS1.BALANCE_ID  and EBCS1.COMPANY=EBPS1.COMPANY AND EBCS1.ERNCD=EBPS1.ERNCD
  and EBCS1.BALANCE_PERIOD = EBPS1.BALANCE_PERIOD
AND EBCS1.BALANCE_QTR = EBPS1.BALANCE_QTR AND EBCS1.EMPL_RCD = EBPS1.EMPL_RCD AND EBCS1.BALANCE_YEAR = EBPS1.BALANCE_YEAR 
AND EBCS1.SPCL_BALANCE =EBPS1.SPCL_BALANCE  ) EBCS
     LEFT OUTER JOIN 
     (
    select  EBPS1.EMPLID ,EBPS1.COMPANY ,EBPS1.BALANCE_ID ,EBPS1.BALANCE_YEAR ,EBPS1.BALANCE_QTR ,
EBPS1.BALANCE_PERIOD ,EBPS1.EMPL_RCD ,EBPS1.SPCL_BALANCE ,EBPS1.ERNCD ,EBPS1.HRS_YTD ,EBPS1.HRS_QTD ,EBPS1.HRS_MTD ,
EBPS1.GRS_YTD ,EBPS1.GRS_QTD ,EBPS1.GRS_MTD,
         row_number() over (partition by EBPS1.EMPLID,EBPS1.EMPL_RCD order by case when EBCS1.EMPLID is not null then 0 else 1 end asc,
         EBCS1.BALANCE_YEAR,EBCS1.BALANCE_QTR,EBCS1.BALANCE_PERIOD,EBCS1.ERNCD) rn
  from TABLE2 EBPS1  left join (select distinct EMPLID,EMPL_RCD,COMPANY,BALANCE_ID,BALANCE_YEAR,BALANCE_PERIOD,ERNCD,SPCL_BALANCE,BALANCE_QTR
  from TABLE1) EBCS1 ON
  EBCS1.EMPLID=EBPS1.EMPLID AND EBCS1.BALANCE_ID=EBPS1.BALANCE_ID  and EBCS1.COMPANY=EBPS1.COMPANY AND EBCS1.ERNCD=EBPS1.ERNCD and EBCS1.BALANCE_PERIOD = EBPS1.BALANCE_PERIOD
AND EBCS1.BALANCE_QTR = EBPS1.BALANCE_QTR AND EBCS1.EMPL_RCD = EBPS1.EMPL_RCD AND EBCS1.BALANCE_YEAR = EBPS1.BALANCE_YEAR AND EBCS1.SPCL_BALANCE =EBPS1.SPCL_BALANCE  ) EBPS
  ON ( EBPS.EMPLID=EBCS.EMPLID AND EBCS.EMPL_RCD=EBPS.EMPL_RCD   AND  EBCS.rn=EBPS.rn  )

但是,如果表Table2中缺少一行,则会得到不正确的结果。例如,如果员工在表1中有16行,在表2中有15,并且对于某些行,ERNCD匹配但是期间/季度不匹配,在这种情况下,我想显示具有不匹配的期间/季度但匹配ERNCD的数据。但是,如果发生不匹配,目前行无组织。如果有人能解决这个问题,请告诉我。如果您有任何问题,请与我们联系。

3 个答案:

答案 0 :(得分:1)

好的,让我们看看这个答案是否符合您的要求。

SELECT a.EMPLID,a.DEDCD, to_char(a.EFFDT,'YYYY-MM-DD') EFFDT, b.DEDCD as DEDCD2,GTN 
   FROM 
   (
   select  EFFDT,GTN,EMPLID,DEDCD,
        row_number() over (partition by EMPLID order by DEDCD) rn
 from table1 ) A
    LEFT OUTER JOIN 
    (
   select  EFFDT,EMPLID,DEDCD,
        row_number() over (partition by EMPLID order by DEDCD) rn
 from table2       
    ) B
 ON ( A.EMPLID=B.EMPLID AND A.EFFDT=B.EFFDT AND a.rn=b.rn)

我在这里假设您只是对通过EMPLID和EFFDT链接的两个表的信息并排感兴趣,并且table1和table2将始终具有相同密钥的相同记录号。

我已经创建了一个示例供您在rextester.com进行测试。

已编辑:新版本

我也试图管理这里作为评论提交的新“要求”。 它变得越来越复杂,但我希望这就是你所需要的:

 SELECT a.EMPLID,a.DEDCD, to_char(a.EFFDT,'YYYY-MM-DD') EFFDT, b.DEDCD as DEDCD2,GTN
    FROM 
    (
    select  t1.EFFDT,t1.GTN,t1.EMPLID,t1.DEDCD,
         row_number() over (partition by t1.EMPLID order by case when t2.EMPLID is not null then 0 else 1 end asc, t1.DEDCD) rn
  from table1 t1 left join (select distinct EMPLID,   EFFDT, DEDCD from    table2) t2 on  t1.EMPLID=t2.EMPLID AND t1.EFFDT=t2.EFFDT  and t1.DEDCD=t2.DEDCD
        ) A
     LEFT OUTER JOIN 
     (
    select  t2.EFFDT,t2.EMPLID,t2.DEDCD,
         row_number() over (partition by t2.EMPLID order by case when t1.EMPLID is not null then 0 else 1 end asc, t2.DEDCD) rn
  from table2 t2  left join (select distinct EMPLID,   EFFDT, DEDCD from    table1) t1 on  t1.EMPLID=t2.EMPLID AND t1.EFFDT=t2.EFFDT and t1.DEDCD=t2.DEDCD
     ) B
  ON ( A.EMPLID=B.EMPLID AND A.EFFDT=B.EFFDT AND a.rn=b.rn)

我已经创建了一个示例供您在rextester.com

进行测试

答案 1 :(得分:0)

您可以通过使用简单连接来实现,如下所示:

SELECT DISTINCT A.EMPLID, B.DEDCD AS DEDCD_2, A.EFFDT, A.DEDCD AS DEDCD_1
FROM table1 A
INNER JOIN table2 B ON A.EMPLID = B.EMPLID
    AND A.EFFDT = B.EFFDT

答案 2 :(得分:0)

我使用以下SQL来查找行。那些标记不正确的问题需要先了解问题。如果我无法正确表达问题,请在投票前告诉我。

SELECT DISTINCT DEDCD,EMPLID,DEDCD2 
 ,XX_GTN_nbr 
  FROM 
  (
  select  A.XX_GTN_nbr,A.EMPLID,A.DEDCD,B.DEDCD AS DEDCD2,
       row_number() over (partition by B.DEDCD
       order by A.EMPLID) rn
from PS_XX_PY50_GDED_RP A LEFT OUTER JOIN PS_GENL_DEDUCTION B
ON ( A.EMPLID=B.EMPLID AND A.EFFDT=B.EFFDT)
WHERE A.DEDCD<>' ' 
 ) WHERE RN=1;