2012-08-09 91 views
2

我有以下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 

给我(主要是甲骨文& SQL Server体验超过的Sybase)有错小本声明。然而,Sybase抛出一个异常:

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

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

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

回答

0

我想这是的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 
     ) ; 
+1

这似乎是一个。谢谢。只需要做一些小小的调整:'更新t'到'UPDATE#temp'。令人沮丧的是,这样简单的事情必须以这种方式写出来! – markblandford 2012-08-09 13:58:45

+0

我认为@valexhome提出了一个较短的版本。 – 2012-08-09 14:00:22

0

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

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

我想你想入手:在UPDATEFROM子句中

update #temp 
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?你想用null更新#temp吗?如果不是那么加上:WHERE:

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