2017-11-18 66 views
0

我是Oracle的新手。我正尝试使用MERGE INTO方法更新SELECT DISTINCT语句中值的表值。我想根据USING表中的内容有条件地更新表的值。 的什么,我基本上要一个快速的图是Oracle合并到(多个连接表)更新集(多个Where语句)返回无效的列规范

MERGE 
INTO update_table ut 
USING 
(SELECT DISTINCT 
t1.column_1 
,t2.column_2 
FROM table_1 t1 
INNER JOIN table_2 t2 
ON t1.foreign_key = t2.primary_key) st 
ON (ut.pk = st.column_1) 
WHEN MATCH UPATE 
SET(ut.update_column = st.column_2 
    WHERE st.column_1 = 1 
    AND st.column_2 = 1 
    ,ut.update_column = st.column_2 
    WHERE st.column_1 = 2 
    AND st.column_2 = 2); 

然而,当我这样做,我得到的,我用SET行了无效的列规格错误。我怎样才能解决这个问题,以成功更新表格,最好是ANSI标准?

回答

0

您可以在using子句本身的选定列表中添加where子句中添加的条件。喜欢这个。 (未经测试。你在where子句条件是不恰当的)

MERGE 
INTO update_table ut 
USING (SELECT DISTINCT 
       t1.column_1 , 
       CASE 
         WHEN t1.column_1 = 1 
           AND t2.column_2 = 1 
         THEN t2.column_1 
         WHEN t1.column_1 = 2 
           AND t2.column_2 = 2 
         THEN t2.column_2 
       END column_2 
     FROM 
       table_1 t1 
     INNER JOIN table_2 t2 ON t1.foreign_key = t2.primary_key 
     ) st 
ON (ut.pk = st.column_1) 
WHEN MATCHED THEN 
UPDATE SET ut.update_column = st.column_2 ; 
+0

好了,所以如果我的理解是正确的,这意味着我不能使用其中在这种情况下,语句。我需要拥有正确的数据集,而不是依赖update语句中的where子句。 – Jizzle21013

+0

@ Jizzle21013:如果你愿意,你可以包含'ut.column_name = value'的where子句以及更新。但对于源表,最好将它限制在using子句本身中。 –