2012-11-27 102 views
0

重写我需要重写以下Oracle 10g中查询在SQL Server 2008中复杂UPDATE查询,从Oracle 10g中

工作这是一个更新查询,在一些领域中检索从SELECT和一些给出(从代码)。

UPDATE "BMAN_SQL"."CELLS_GLIST" 
    SET ("GLIST_ID", "GLIST_VALUE_ID") = (

             SELECT "GLIST_ID", "GLIST_VAL_ID" 
             FROM "BMAN_SQL"."GLISTS_VAL_UOR" 
             WHERE ("UOR_ID"=3) 
             AND ("GLIST_CODE"='X') 

             ), 
     "SESSION_ID" = 1553245736, 
     "USER_ID" = 13 

WHERE EXISTS (SELECT * FROM ...) 

请注意,我需要与甲骨文使用UPDATE SET ... WHERE EXIST ...结构兼容性(查询由QueryBuilder的类自动生成每个特定DBMS)。

我也不能写:

UPDATE "BMAN_SQL"."CELLS_GLIST" 
    SET ("GLIST_ID", "GLIST_VALUE_ID", "SESSION_ID", "USER_ID") = (

         SELECT "GLIST_ID", "GLIST_VAL_ID", 1553245736, 13 
         FROM "BMAN_SQL"."GLISTS_VAL_UOR" 
         WHERE ("UOR_ID"=3) 
         AND ("GLIST_CODE"='X') 

     ) 

WHERE EXISTS (SELECT * FROM ...) 

,因为(每本旧线Oracle "Cannot update to NULL"因为)它,如果SELECT不取任何记录将返回一个错误。

在此先感谢!

回答

0

在这种情况下,您需要加入更新查询。请参阅下面的语法。 <Your condition here>将此部分替换为您的连接条件。

UPDATE m 
SET 
    GLIST_ID = r.GLIST_ID 
    ,GLIST_VALUE_ID = r.GLIST_VAL_ID 
    , SESSION_ID= 1553245736 
    , USER_ID = 13 
from BMAN_SQL.CELLS_GLIST m 
inner join BMAN_SQL.GLISTS_VAL_UOR r on <Your condition here> 
WHERE 
r.UOR_ID=3 AND (r.GLIST_CODE='X') AND 
EXISTS (SELECT * FROM ...) 

编辑

UPDATE BMAN_SQL.CELLS_GLIST 
SET 
GLIST_ID = (SELECT TOP 1 GLIST_ID FROM BMAN_SQL.GLISTS_VAL_UOR WHERE (UOR_ID=3) AND (GLIST_CODE='X')) 
,GLIST_VALUE_ID = (SELECT TOP 1 GLIST_VAL_ID FROM BMAN_SQL.GLISTS_VAL_UOR WHERE (UOR_ID=3) AND (GLIST_CODE='X')) 
,SESSION_ID = 1553245736 
,USER_ID = 13 
WHERE EXISTS (SELECT * FROM ...) 
+0

因此,没有别的办法吗? – Teejay

+0

@Teejay:这是否适合你? –

+0

你的编辑符合我的需求更多...但我想知道'UPDATE SET FLD1 = VAL1,FLD2 = VAL2'与'UPDATE SET(FLD1,FLD2)=(VAL1,VAL2)'是一样的。它应该,teoretically ... – Teejay