使用子查询派生表错误更新

时间:2012-08-09 09:59:25

标签: sql sybase derived-table

我有以下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。当然,我可以将子查询放在临时表中并加入它但我真的想知道“正确”的方法应该是什么以及到底出了什么问题。

非常感谢任何想法或指导。

3 个答案:

答案 0 :(得分:3)

似乎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,该怎么办?你想要将#temp更新为null吗?如果没有,那么添加WHERE:

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

答案 1 :(得分:0)

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

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

我想你想从:

开始
update #temp

答案 2 :(得分:0)

我想这是FROM UPDATE子句中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
        ) ;