加入新表时Oracle Sql重复行
我正在使用oracle sql连接表。我使用以下代码:加入新表时Oracle Sql重复行,sql,oracle,left-join,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
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';
到目前为止,它还可以正常工作,但我想将另一个表与PARTY\u ACCOUNT\u relationship表(ACCOUNT\u KEY)连接起来,该表有一个共同的列(ENTITY\u KEY),我想包括一些新表的列,但当我这样做时,它就变得复杂了。我在“where”语句前添加以下行:
LEFT JOIN EVALUATE_RULE ER
ON PR.ACCOUNT_KEY = ER.ENTITY_KEY
有人知道问题出在哪里吗?如果将另一个表联接到现有查询中会导致现有行重复,这是因为要联接的表在用作联接键的列中有重复的值 在你的情况下,如果你
SELECT ENTITY_KEY FROM EVALUATE_RULE GROUP BY ENTITY_KEY HAVING COUNT(*) > 1
您将看到哪些实体_键是重复的。当这些重复项连接到现有数据时,必须将现有数据加倍,以允许结果集中存在EVALUATE_规则中具有相同实体_键的两行
必须对表进行重复数据消除,或者在ON条件中加入其他子句,以进一步限制来自EVALUATE_规则的行
例如,在添加EVALUATE\u RULE
并将ER.
放入SELECT
列表后,假设您可以看到ER中的行是status='old'
和status='current'
,但您知道您只想要current
行。。所以把和er.status='current'
放在你的ON
子句中
您的注释表明,多个记录因不关心的某个列而不同,因此此技术仅选择一行:
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
如果您想了解此操作的原因,请单独运行该sql:
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
它只为表中的每一行分配一个数字,每当实体键更改时,该数字将以1重新启动,因此我们可以选择所有rown=1
如果您确实需要一些特定的内容,如“evaluate_rule中的最新行”,您可以使用以下内容:
SELECT e.*, ROW_NUMBER() OVER(PARTITION BY e.entity_key ORDER BY e.created_date DESC) as rown FROM evaluate_rule e
现在,最新的
创建日期
行将始终具有rown=1
如果将另一个表连接到现有查询中会导致现有行重复,这是因为要连接的表在用作连接键的列中具有重复的值
在你的情况下,如果你
SELECT ENTITY_KEY FROM EVALUATE_RULE GROUP BY ENTITY_KEY HAVING COUNT(*) > 1
您将看到哪些实体_键是重复的。当这些重复项连接到现有数据时,必须将现有数据加倍,以允许结果集中存在EVALUATE_规则中具有相同实体_键的两行
必须对表进行重复数据消除,或者在ON条件中加入其他子句,以进一步限制来自EVALUATE_规则的行
例如,在添加EVALUATE\u RULE
并将ER.
放入SELECT
列表后,假设您可以看到ER中的行是status='old'
和status='current'
,但您知道您只想要current
行。。所以把和er.status='current'
放在你的ON
子句中
您的注释表明,多个记录因不关心的某个列而不同,因此此技术仅选择一行:
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
如果您想了解此操作的原因,请单独运行该sql:
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
它只为表中的每一行分配一个数字,每当实体键更改时,该数字将以1重新启动,因此我们可以选择所有rown=1
如果您确实需要一些特定的内容,如“evaluate_rule中的最新行”,您可以使用以下内容:
SELECT e.*, ROW_NUMBER() OVER(PARTITION BY e.entity_key ORDER BY e.created_date DESC) as rown FROM evaluate_rule e
现在,根据您的描述,最新的
创建日期
行将始终具有rown=1
,表评估规则具有帐户密钥=实体密钥的moro记录
您可以更改查询部分:
LEFT JOIN EVALUATE_RULE ER ON PR.ACCOUNT_KEY = ER.ENTITY_KEY
到
如果您发布了评估规则的结构(指示PK列),我可以更改我的答案,让您在最终查询中包含评估规则列。据我从您的描述中了解,表评估规则具有帐户密钥=实体密钥的moro记录 您可以更改查询部分:
LEFT JOIN EVALUATE_RULE ER ON PR.ACCOUNT_KEY = ER.ENTITY_KEY
到
如果您发布EVALUATE_规则的结构(指示PK列),我可以更改我的答案,让您在最终查询中包含EVALUATE_规则列。mysql或Oracle?请删除不兼容的标记。我正在使用Oracle sql。请将WHERE子句的PR条件移动到ON子句,以获得true LEFT JOIN结果。但即使没有WHERE,它也有相同的错误。请共享一些示例数据MySQL或Oracle?请删除不兼容的标记。我正在使用Oracle sql。请将WHERE子句的PR条件移动到ON子句,以获得true LEFT JOIN结果。但是,即使没有WHERE,它也有相同的错误。请共享一些示例数据。虽然这可能行得通,但几乎没有用,因为它不会向查询中添加任何内容!它所做的只是加入一组你们已经知道的不同的值。请记住,OP希望“包括一些新表的列”。在大多数情况下,使用DISTINCT压缩重复项是lame/lazy SQL实践的宗旨。最好确定EVALUATE_规则中的哪些新行是不需要的,并排除它们以获得唯一的实体_键。不仅仅是在RTE之后进行重复数据消除fact@CAius,我明白了,正如我现在在回答中指定的,我等待关于表结构的信息。虽然这可能有效,但几乎没有用,因为它不会向查询添加任何内容!它所做的只是加入一组你们已经知道的不同的值。请记住,OP希望“包括一些新表的列”。在大多数情况下,使用DISTINCT压缩重复项是lame/lazy SQL实践的宗旨。最好确定EVALUATE_规则中的哪些新行是不需要的,并排除它们以获得唯一的实体_键。不仅仅是在RTE之后进行重复数据消除fact@CAius,我明白了,正如我现在在回答中指定的,我等待关于表结构的信息。记录中的不同之处在于它们的名称字段,这不构成