我正在使用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
有谁知道问题出在哪里?
答案 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列。