3

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

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

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

4

4 回答 4

3

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

尝试使用这个:

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
于 2012-08-09T13:28:22.993 回答
0

我猜这是 Sybase 的限制(不允许派生表)FROMUPDATE. 也许你可以这样重写:

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
        ) ;
于 2012-08-09T13:26:46.793 回答
0

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

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

我想你想开始:

update #temp
于 2012-08-09T13:10:35.450 回答
0

此语法在 Sybase 中有效吗?

update dstTable T
set (T.field1, T.field2, T.field3) = 
       (select S.value1, S.value2, S.value3
        from srcTable S
         where S.key = T.Key);

我相信相关子查询可以像你喜欢的那样复杂(包括使用 CTE 等)。它只需要投影正确数量(和类型)的值。

于 2022-02-10T01:37:44.767 回答