【问题标题】:Complex UPDATE query in SQL Server 2008, rewrite from Oracle 10gSQL Server 2008 中的复杂 UPDATE 查询,从 Oracle 10g 重写
【发布时间】:2012-11-27 11:44:41
【问题描述】:

我需要重写以下 Oracle 10g 查询以在 SQL Server 2008

中工作

这是一个更新查询,其中一些字段是从 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 兼容(查询由每个特定 DBMS 的 QueryBuilder 类自动构建)。

我也不能写:

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 没有获取任何记录,它会返回错误。

提前致谢!

【问题讨论】:

    标签: sql-server-2008 oracle10g


    【解决方案1】:

    在这种情况下,您需要加入更新查询。请参阅下面的语法。 <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 ... )
    

    【讨论】:

    • 您的编辑更符合我的需求...但我想知道UPDATE SET FLD1 = VAL1, FLD2 = VAL2 是否与UPDATE SET (FLD1, FLD2) = (VAL1, VAL2) 相同。理论上应该……
    • @Teejay:是的,除非查询发生变化,否则它的工作方式相同。我也期待 Sql server 会优化这个查询只运行一次但不确定。你可以查看它的执行计划。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多