Java Oracle中基于rowid的更新
我想在oracle(11g)中使用join更新表值, 我已经使用rowid作为同一个表的连接参数,使用rowid作为连接参数是否安全。 下面是我用于更新的查询,我已经在本地数据库上测试了相同的查询,它工作正常,但是是否存在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
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)