【问题标题】:Update with Sub Query Derived Table Error使用子查询派生表错误更新
【发布时间】:2012-08-06 12:44:14
【问题描述】:

我有以下 SQL 语句来简单地使用 Sybase 15 数据库中的最新包版本号更新 #temp 临时表。

UPDATE t
SET versionId = l.latestVersion
FROM #temp t INNER JOIN (SELECT gp.packageId
                                , MAX(gp.versionId) latestVersion
                         FROM Group_Packages gp 
                         WHERE gp.groupId IN (SELECT groupId 
                                              FROM User_Group 
                                              WHERE userXpId = 'someUser')
                         GROUP BY gp.packageId) l
ON t.packageId = l.packageId

对我来说(主要是 Oracle 和 SQL Server 的经验比 Sybase 多)这句话没有什么问题。但是,Sybase 会抛出异常:

You cannot use a derived table in the FROM clause of an UPDATE or DELETE statement.

现在,我不明白这里有什么问题。我认为这是因为使用了聚合 / GROUP BY。当然,我可以将子查询放在临时表中并加入它,但我真的很想知道“正确”的方法应该是什么,到底是什么错误。

任何想法或指导将不胜感激。

【问题讨论】:

    标签: sql sybase derived-table


    【解决方案1】:

    我猜这是UPDATEFROM 子句中Sybase 的限制(不允许派生表)。也许你可以这样重写:

    UPDATE t
    SET t.versionId = l.versionId
    FROM #temp t
      INNER JOIN 
        Group_Packages l
          ON t.packageId = l.packageId
    WHERE
        l.groupId IN ( SELECT groupId 
                       FROM User_Group 
                       WHERE userXpId = 'someUser')
      AND
        l.versionId =
            ( SELECT MAX(gp.versionId)
              FROM Group_Packages gp 
              WHERE gp.groupId IN ( SELECT groupId 
                                    FROM User_Group 
                                    WHERE userXpId = 'someUser')
                AND gp.packageId = l.packageId
            ) ;
    

    【讨论】:

    • 这似乎是一个。谢谢你。只需稍作调整:UPDATE tUPDATE #temp。令人沮丧的是,这么简单的东西必须以这种方式编写!
    • 我认为@valexhome 提供了一个更短的版本。
    【解决方案2】:

    SYBASE 似乎不支持 UPDATE FROM 类中的嵌套查询。 Similar problem

    尝试使用这个:

    UPDATE #temp
    SET versionId =  (SELECT MAX(gp.versionId) latestVersion
                             FROM Group_Packages gp 
                             WHERE gp.packageId=#temp.packageId
                                    and
                                   gp.groupId IN (SELECT groupId 
                                                  FROM User_Group 
                                                  WHERE userXpId = 'someUser')
    
                             )
    

    如果 l.latestVersion 为 NULL 怎么办?你想用 null 更新 #temp 吗?如果没有,则添加 WHERE:

        WHERE (SELECT MAX(gp.versionId)
                              ....
                                     ) is not null
    

    【讨论】:

      【解决方案3】:

      #temp 的表别名称为“t”,原始表称为“t”。

      我的猜测是这就是问题所在。

      我想你想开始:

      update #temp
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-26
        • 1970-01-01
        • 2021-11-03
        • 1970-01-01
        • 2017-03-29
        • 2016-08-05
        • 1970-01-01
        相关资源
        最近更新 更多