我有两张桌子 表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的数据。但是,如果发生不匹配,目前行无组织。如果有人能解决这个问题,请告诉我。如果您有任何问题,请与我们联系。
答案 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;