Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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
Java Oracle中基于rowid的更新_Java_Mysql_Database_Oracle_Oracle11g - Fatal编程技术网

Java Oracle中基于rowid的更新

Java Oracle中基于rowid的更新,java,mysql,database,oracle,oracle11g,Java,Mysql,Database,Oracle,Oracle11g,我想在oracle(11g)中使用join更新表值, 我已经使用rowid作为同一个表的连接参数,使用rowid作为连接参数是否安全。 下面是我用于更新的查询,我已经在本地数据库上测试了相同的查询,它工作正常,但是是否存在rowid不匹配的情况 MERGE INTO GEOTAG g USING (SELECT g2.rowid AS rid, um.RETAILER_CODE FROM GEOTAG g2 JOIN RETAILER_AD_DSE b ON

我想在oracle(11g)中使用join更新表值, 我已经使用rowid作为同一个表的连接参数,使用rowid作为连接参数是否安全。 下面是我用于更新的查询,我已经在本地数据库上测试了相同的查询,它工作正常,但是是否存在rowid不匹配的情况

MERGE 
INTO    GEOTAG g 
USING   (SELECT  g2.rowid AS rid, um.RETAILER_CODE
FROM    GEOTAG g2 
JOIN    RETAILER_AD_DSE b 
ON      b.CODE = g2.RETAILER_CODE
JOIN USER_HIERARCHY_MASTER um
ON um.RETAILER_PRIMARY_ETOPUP = b.RETAILER_PRIMARY_ETOPUP) src 
ON      (g.rowid = src.rid) 
WHEN MATCHED THEN UPDATE 
SET g.RETAILER_CODE = src.RETAILER_CODE;

一个
rowid
在一个表中是唯一的,所以如果“safe”的意思是将一行连接到它自己,那么,是的,这是安全的

另一方面,在执行相关更新时,代码似乎过于复杂。我怀疑您只是想这样做(如果
零售商广告dse
用户层次结构\u主文件
中始终存在匹配行,则可以省略存在的


一个
rowid
在一个表中是唯一的,所以如果“safe”的意思是将一行连接到它自己,那么,是的,这是安全的

另一方面,在执行相关更新时,代码似乎过于复杂。我怀疑您只是想这样做(如果
零售商广告dse
用户层次结构\u主文件
中始终存在匹配行,则可以省略存在的


您好,贾斯汀,谢谢您的回答,我使用查询(如果存在)更新了70k条记录,但执行时间太长,所以我将其更改为基于rowid合并。@ShaileshYadav-我有点难以想象为什么查询计划会有意义的不同。如果您不想调查为什么优化器为标准方法选择了一个糟糕的计划(可能),您当然可以使用一个奇怪的
merge
构造(尽管我确实希望在连接中使用主键,而不是
rowid
)。不过,我会确保给下一个人留下一堆评论。@JustinCave-我没有详细阅读OP的合并尝试,但是当你想更新PK时,ROWID上的“加入”(实际上,在合并语句中匹配)是有意义的。您可以通过PK进行匹配,但不能在同一个MERGE语句中更新它。罗维德的把戏相当标准,尽管在智力上不讨人喜欢;正是出于这个原因,我见过它被多次使用。@mathguy-如果
retailer\u code
geotag
的主键,那么,当然,匹配
rowid
是有意义的。不过,仅仅从标识符来看,这似乎不太可能。听起来标准相关更新的问题是性能而不是Oracle错误。嗨,Justin,谢谢你的回答,我已经使用了这个查询(如果存在的话)用于更新70k条记录,但执行时间太长,因此我将其更改为基于rowid合并。@ShaileshYadav-我有点难以想象为什么查询计划会有意义的不同。如果您不想调查为什么优化器为标准方法选择了一个糟糕的计划(可能),您当然可以使用一个奇怪的
merge
构造(尽管我确实希望在连接中使用主键,而不是
rowid
)。不过,我会确保给下一个人留下一堆评论。@JustinCave-我没有详细阅读OP的合并尝试,但是当你想更新PK时,ROWID上的“加入”(实际上,在合并语句中匹配)是有意义的。您可以通过PK进行匹配,但不能在同一个MERGE语句中更新它。罗维德的把戏相当标准,尽管在智力上不讨人喜欢;正是出于这个原因,我见过它被多次使用。@mathguy-如果
retailer\u code
geotag
的主键,那么,当然,匹配
rowid
是有意义的。不过,仅仅从标识符来看,这似乎不太可能。听起来标准相关更新的问题是性能而不是Oracle错误。您确定此sql在语义上正确吗?它选择带有
geotag.retailer\u code=retailer\u ad\u dse.code
的行并更新同一列?谢谢frank,我更新了查询。您确定此sql的语义正确吗?它选择带有
geotag.retailer\u code=retailer\u ad\u dse.code
的行,并更新同一列?谢谢frank,我已经更新了查询。
UPDATE geotag g
   SET g.retailer_code = (SELECT code
                            FROM retailer_ad_dse rad
                                 JOIN user_hierarchy_master uhm
                                   ON uhm.retailer_primary_etopup = rad.retailer_primary_etopup
                           WHERE g.retailer_code = rad.code)
 WHERE EXISTS (SELECT code
                 FROM retailer_ad_dse rad
                      JOIN user_hierarchy_master uhm
                        ON uhm.retailer_primary_etopup = rad.retailer_primary_etopup
                 WHERE g.retailer_code = rad.code)