我想使用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;
答案 0 :(得分:2)
rowid
在表格中是唯一的,所以如果“安全”只是意味着你将加入一行,那么,是的,这是安全的。
另一方面,您的代码似乎是一种相当复杂的相关更新方式。我怀疑你只是想要这个(如果WHERE EXISTS
和retailer_ad_dse
中总会有匹配的行,你可以省略user_hierarchy_master
。
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)