具有一对多选项的WHERE语句

时间:2014-10-10 10:22:39

标签: sql oracle

我有一个查询

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'的最佳方式是什么?

2 个答案:

答案 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';