2012-08-09 2 views
2

У меня есть следующий оператор SQL, который просто обновляет временную таблицу #temp с последним номером версии пакета в нашей базе данных Sybase 15.Обновление с ошибкой производной таблицы Sub Query

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. Конечно, я мог бы поместить вспомогательный запрос в таблицу temp и присоединиться к нему, но я действительно хочу знать, что такое «правильный» метод и что, черт возьми, неправильно.

Любые идеи или рекомендации будут высоко оценены.

ответ

0

Я предполагаю, что это ограничение Sybase (не допуская производных таблиц) в предложении о UPDATEFROM. Может быть, вы можете переписать так:

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

Это похоже. Спасибо. Просто нужно было сделать небольшую настройку: 'UPDATE t'' UPDATE # temp'. Разочарование того, что что-то настолько простое должно быть написано таким образом! – markblandford

+0

Я думаю, что @valexhome придумал более короткую версию. –

0

Ваш псевдоним таблицы для #temp называется «t», а ваша исходная таблица называется «t».

Я предполагаю, что это проблема.

Я думаю, что вы хотите начать с:

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? Вы хотите обновить #temp с нулевым значением? если нет, то добавьте ГДЕ:

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