【发布时间】:2016-10-14 08:46:14
【问题描述】:
我有两张桌子 表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
当我加入时,选择应该只返回两行,输出应该是
- 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 编写了一个查询来从两个表中获取值:
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 匹配但 Period/Quarter 不匹配,在这种情况下,我想显示 Period/Quarter 不匹配但 ERNCD 匹配的数据。但目前,如果发生不匹配,行会变得杂乱无章。请让我知道是否有人能解决这个问题。如果您有任何问题,请告诉我。
【问题讨论】:
-
正如你提到的
JOIN是答案尝试写一个,告诉你是否遇到任何问题 -
是什么决定了table2中的XXYY行与table1中的XXYY行匹配?为什么不是 XXYZ?还有,table1的主键是什么?
-
正如@Boneist 已经询问的那样,您需要澄清在第一个表中过滤掉 XXYZ 的标准。也许您需要 EMPLID 的最高 GTN 记录?
-
问题是 table1 和 table2 上的 KEYS 不同。因此面临这个问题
-
@R_Prasad 如果他们有不同的键,请告诉我们两个表的键。但无论如何,你能用自然语言描述你需要什么输出吗?似乎是,除非您添加条件,否则没有明确的方法可以回答您的问题。