2012-08-09 46 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