0

我需要重新编写以下Oracle 10g查询才能在SQL Server 2008中工作

这是一个更新查询,其中一些字段是从 a 中检索的,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 ...与 Oracle 兼容的结构(查询由 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 )如果没有获取任何记录,它会返回错误。

提前致谢!

4

1 回答 1

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 ... )
于 2012-11-27T13:04:05.933 回答