使用oracle案例的俱乐部更新声明

时间:2016-10-31 13:48:55

标签: oracle

我正在尝试根据错误情况使用不同的错误代码更新同一列。

更新条件(单独):

UPDATE MEM_SRC_EXTN
SET INT_VALUE_1 =100
WHERE ISNULL(TYPE_VALUE,'') =''
OR ISNULL(TYPE,'') =''
OR ISNULL(VALUE_1,'') =''
OR ISNULL(VALUE_2,'') ='';

UPDATE MEM_SRC_EXTN EXTN
SET INT_VALUE_1=222
WHERE NOT EXISTS 
(SELECT 1
FROM CMC_MEM_SRC SRC 
WHERE EXTN.TYPE_VALUE = SRC.TN_ID);

UPDATE MEM_SRC_EXTN
SET INT_VALUE_1=333 
GROUP BY TYPE_VALUE 
HAVING COUNT(VALUE_1)>1;

由于我必须根据条件将这3个更新条件归为一个,因此它首先检查条件然后更新列值,而不是每次都触发所有3个更新语句。

我想出了这个解决方案,但不确定这是否有效?

UPDATE MEM_SRC_EXTN EXTN
SET INT_VALUE_1 = CASE 
                          WHEN (ISNULL(TYPE_VALUE,'') ='' OR ISNULL(TYPE,'') ='' OR ISNULL(VALUE_1,'') =''OR ISNULL(VALUE_2,'') ='')
                          THEN 100
                          WHEN NOT EXISTS (SELECT 1 FROM CMC_MEM_SRC SRC WHERE EXTN.TYPE_VALUE = SRC.TN_ID)
                          THEN 222
                          WHEN GROUP BY TYPE_VALUE HAVING COUNT(VALUE_1)>1
                          THEN 333
                          ELSE 000
                        END

2 个答案:

答案 0 :(得分:0)

首先,您应该使用正确的声明顺序。如果WHEN GROUP BY TYPE_VALUE HAVING COUNT(VALUE_1)>1是最后一次,那么万一它应该是第一个。 除此之外你不能写WHEN GROUP BY TYPE_VALUE HAVING COUNT(VALUE_1)>1。 orcle中的= ''= null相同并不是真的,并且false false不是null 您可以将其重写为子查询

UPDATE MEM_SRC_EXTN EXTN
SET INT_VALUE_1 = CASE 
     WHEN exists (SELECT NULL 
                    FROM MEM_SRC_EXTN sub_extn
                   WHERE sub_extn.TYPE_VALUE = EXTN.TYPE_VALUE 
                      OR (sub_extn.TYPE_VALUE is NULL AND EXTN.TYPE_VALUE IS NULL)
                   GROUP BY TYPE_VALUE 
                  HAVING COUNT(VALUE_1)>1)
       THEN 333
     WHEN NOT EXISTS (SELECT 1 
                        FROM CMC_MEM_SRC SRC 
                       WHERE EXTN.TYPE_VALUE = SRC.TN_ID)
       THEN 222
     WHEN TYPE_VALUE is null OR TYPE is null OR VALUE_1 is null OR VALUE_2 is null
       THEN 100
     ELSE 000
     END

但是这个查询很有用,可能你可能会使用别的东西。请考虑merge

答案 1 :(得分:0)

我会考虑一个MERGE声明。像这样:

MERGE INTO mem_src_extn t USING 
( 
SELECT mse.rowid row_id,
       CASE WHEN mse.type_value IS NULL OR mse."TYPE" IS NULL OR mse.VALUE_1 IS NULL or mse.VALUE_2 IS NULL THEN 100
            WHEN ( SELECT count(*) FROM cmc_mem_src cms WHERE cms.tn_id = mse.type_value ) = 0 THEN 222
            WHEN count(mse.value_1) over ( partition by type_value ) > 1 THEN 333
       ELSE '000' int_value_1  
FROM   mem_src_extn mse
) u
ON ( t.rowid = u.row_id )
WHEN MATCHED THEN UPDATE SET t.int_value_1 = u.int_value_1 WHERE u.inv_value_1 != '000';

MERGE语句为开发人员带来了额外的好处 - 您只需运行SELECT部分语句即可查看结果。这使得调试变得更容易。

另请注意,您原来的UPDATE语句不会更新任何内容000,但您建议的解决方案会。因此,目前尚不清楚您的要求是什么。由于000的{​​{1}}子句中的WHERE子句,我的解决方案不会向UPDATE更新任何内容。如果要将不满足上述三个条件中任何一个的行设置为MERGE,则可以删除它。