我有一个查询
UPDATE TBL$TEMPLATE_PARAM
SET NAME='new_name'
WHERE NAME='old_name' AND FIXED_VALUE='some_value';
我想用另外一个WHERE表达式改进它:AND BEAN_NAME='bean'
但BEAN_NAME
是来自其他表TBL$TEMPLATE
的一行。
它的一对多(一个模板 - 许多模板参数)。 TBL$TEMPLATE_PARAM
存储TEMPLATE_ID
及其对TEMPLATE ID的外键。
写WHERE NAME='old_name' AND FIXED_VALUE='some_value' AND TBL$TEMPLATE.BEAN_NAME='bean'
的最佳方式是什么?
答案 0 :(得分:2)
您可以使用子查询:
UPDATE TBL$TEMPLATE_PARAM
SET NAME='new_name'
WHERE NAME='old_name' AND
FIXED_VALUE='some_value' AND
TBL$TEMPLATE_PARAM.TEMPLATE_ID IN (SELECT ID
FROM TBL$TEMPLATE
WHERE BEAN_NAME='bean')
答案 1 :(得分:1)
我喜欢Mureinik的解决方案,但为了完整起见,我想我会提供一个使用merge
语句的解决方案。
由于我们知道要更新的表TBL$TEMPLATE_PARAM
与用于过滤记录的表TBL$TEMPLATE
之间存在多对一关系,因此merge
语句为非常适合。
具体来说,作为Oracle documentation states (11g),"您无法在同一MERGE语句中多次更新目标表的同一行"
使用merge
语句时,了解这些表之间的关系类型至关重要。
这是我的替代解决方案:
MERGE INTO tbl$template_param ttp USING tbl$template tt ON (ttp.template_id = tt.id )
WHEN MATCHED THEN
UPDATE
SET ttp.NAME ='new_name'
WHERE 1 = 1
AND tt.bean_name = 'bean'
AND ttp.NAME = 'old_name'
AND ttp.fixed_value = 'some_value';