Oracle Sql加入新表时重复行

时间:2017-08-03 09:56:16

标签: sql oracle left-join

我正在使用oracle sql来连接表。我使用以下代码:

SELECT 
T.TRANSACTION_KEY,
PR.ACCOUNT_KEY,
T.ACCT_CURR_AMOUNT,
T.EXECUTION_LOCAL_DATE_TIME,
TC.DESCRIPTION,
T.OPP_ACCOUNT_NAME,
T.OPP_COUNTRY,
PT.PARTY_TYPE_DESC,
P.PARTY_NAME,
P.CUSTOM_SMALL_STRING_02,
CO.COUNTRY_NAME,
LE.LIST_CD

FROM TRANSACTIONS T
LEFT JOIN TRANSACTION_CODE TC
 ON T.TRANSACTION_CODE = TC.ENTITY
LEFT JOIN PARTY_ACCOUNT_RELATION PR
 ON T.ACCOUNT = PR.ACCOUNT
LEFT  JOIN PARTY P
 ON PR.PARTY_KEY = P.PARTY_KEY
LEFT  JOIN PARTY_TYPE PT
 ON P.PARTY_TYPE = PT.ENTITY
LEFT  JOIN COUNTRY CO
 ON T.OPP_COUNTRY = CO.ENTITY
LEFT  JOIN LISTED_ENTITY LE
 ON CO.COUNTRY = LE.ENTITY_KEY

WHERE
  PR.PARTY_KEY = '111111111' and T.EXECUTION_LOCAL_DATE_TIME>'2017-01-01';

它一直运行到现在但我想加入另一个表,它有一个共同的列(ENTITY_KEY)和PARTY_ACCOUNT_RELATION表(ACCOUNT_KEY),我想要包含一些新表的列,但是当我这样做时,它变成了被公开的。我在&#34之前添加以下行;其中" statment:

LEFT JOIN EVALUATE_RULE ER
 ON PR.ACCOUNT_KEY = ER.ENTITY_KEY

有谁知道问题出在哪里?

2 个答案:

答案 0 :(得分:2)

如果将另一个表连接到现有查询会导致现有行重复,那是因为要加入的表在用作连接键的列中具有重复值

在你的情况下,如果你这样做

SELECT ENTITY_KEY FROM EVALUATE_RULE GROUP BY ENTITY_KEY HAVING COUNT(*) > 1

您将看到哪些entity_keys是重复的。当这些重复项连接到现有数据时,现有数据必须加倍,以允许EVALUATE_RULE中具有相同ENTITY_KEY的两行存在于结果集中

您必须对表进行重复数据删除,或将其他子句置于ON条件中,以进一步限制来自EVALUATE_RULE的行。

例如,在添加EVALUATE_RULE并将ER.*放入SELECT列表后,请假设您可以看到来自ER的行是status = 'old'和{{1}但是你知道你只想要status = 'current'个..所以把current放在你的AND er.status = 'current'条款中

您的评论表明多条记录因您不关心的某些列而不同,因此此技术只会选择一行:

ON

如果您想了解其工作原理的信息,请单独运行该SQL:

LEFT JOIN 
(SELECT e.*, ROW_NUMBER() OVER(PARTITION BY e.entity_key ORDER BY e.name) as rown FROM evaluate_rule e) er
ON
  er.entity_key = pr.account_key and 
  er.rown = 1

它只是为表中的每一行指定一个数字,每次entity_key更改时,数字都会重新开始,因此我们可以选择所有SELECT e.*, ROW_NUMBER() OVER(PARTITION BY e.entity_key ORDER BY e.name) as rown FROM evaluate_rule e ORDER BY e.entity_key -- i added this to make it more clear what is going on. You don't need it in your main query

的数字。

如果结果你想要一些特定的东西,比如“evaluate_rule的最新一行”,你可以使用这样的东西:

rown = 1

现在最新的SELECT e.*, ROW_NUMBER() OVER(PARTITION BY e.entity_key ORDER BY e.created_date DESC) as rown FROM evaluate_rule e 行始终有created_date

答案 1 :(得分:0)

就我的描述而言,我可以理解,表EVALUATE_RULE具有ACCOUNT_KEY = ENTITY_KEY的moro记录。

您可以更改查询部分:

start/w MyApp.exe 1^>out.txt 2^>err.txt

LEFT JOIN EVALUATE_RULE ER  ON PR.ACCOUNT_KEY = ER.ENTITY_KEY

如果您发布EVALUATE_RULE的结构(表示PK列),我可以更改我的答案,让您在最终查询中包含EVALUATE_RULE列。