Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
加入新表时Oracle Sql重复行_Sql_Oracle_Left Join - Fatal编程技术网

加入新表时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

我正在使用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';
到目前为止,它还可以正常工作,但我想将另一个表与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,我明白了,正如我现在在回答中指定的,我等待关于表结构的信息。记录中的不同之处在于它们的名称字段,这不构成