2014-10-10 30 views
1

我有一個查詢WHERE一個說法很多選項

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

1選項存在使用關鍵字和一個聯接.. – mreiterer 2014-10-10 10:25:10

+0

http://stackoverflow.com/questions/14389891/select-a-value-from-specific-table -with-where子句上,另一表 – 2014-10-10 10:27:04

回答

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

我喜歡Mureinik的解決方案,但爲了完整起見,我想我會提供使用merge聲明的解決方案。

由於我們知道正在更新的表格TBL$TEMPLATE_PARAM和用於過濾記錄的表格之間存在多對一關係,因此TBL$TEMPLATEmerge語句非常適合。

具體而言,作爲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';