Как написать UPDATE SQL с псевдонимом таблицы в SQL Server 2008?

213

У меня есть очень простой UPDATE SQL-

UPDATE HOLD_TABLE Q SET Q.TITLE = 'TEST' WHERE Q.ID = 101;

Этот запрос работает отлично в Oracle, Derby, MySQL- но он терпит неудачу в SQL Server 2008 с следующей ошибкой:

«Msg 102, Уровень 15, Состояние 1, Строка 1 Неверный синтаксис рядом с« Q ».»

Если я удаляю все вхождения псевдонима «Q» из SQL, тогда он работает.

Но мне нужно использовать псевдоним.

javauser71
источник
5
Зачем вам нужен псевдоним? Не похоже, что вам это нужно.
Марк Байерс
5
Да - с точки зрения программирования мне это не нужно. Но у меня есть существующая / старая библиотека, которая генерирует все виды DML SQL с псевдонимами таблиц. В библиотеке много классов со сложной логикой. Теперь избавиться от псевдонимов таблиц в библиотеке - больше работы, чем настроить существующую логику для работы с MSSQL. Также, когда задействованы несколько таблиц, мне нужно иметь псевдоним таблицы.
javauser71

Ответы:

422

Синтаксис использования псевдонима в операторе обновления на SQL Server выглядит следующим образом:

UPDATE Q
SET Q.TITLE = 'TEST'
FROM HOLD_TABLE Q
WHERE Q.ID = 101;

Псевдоним не должен быть здесь необходимым, хотя.

Марк Байерс
источник
2
Да !!! Оно работает. Спасибо за быстрый ответ. Вы случайно не знаете, почему MSSQL-сервер поддерживает такой нетрадиционный синтаксис для обновления?
javauser71
3
Марк Байерс - отличный ответ !! Этот синтаксис позволяет мне добавить закомментированный оператор Select, который позволяет мне протестировать обновление, выполнив сначала выбор (выделите из выбора вниз и выполните):SET Q.TITLE = 'TEST' -- SELECT *
2
Ницца. Это облегчает использование intellisense в предложении where.
Магнус
Это не псевдоним. Это просто полное имя «table.column»: - /
ScottWelker
18

Вы всегда можете использовать CTE (Common Tabular Expression), подход.

;WITH updateCTE AS
(
    SELECT ID, TITLE 
    FROM HOLD_TABLE
    WHERE ID = 101
)

UPDATE updateCTE
SET TITLE = 'TEST';
Ryk
источник
Да, это тоже работает. Но для программы JDBC / Java это своего рода сложный синтаксис. Спасибо за ваш ответ.
javauser71
-1

Особый случай для Postgres

Список приведенных выше решений не будет работать для меня. Итак, вот решение для Postgres

Как я огонь мой запрос

UPDATE table Q SET Q.is_active = FALSE ,Q.is_delete = TRUE WHERE Q.name = 'XYZ';

Результат: ОШИБКА: столбец "q" отношения "таблица" не существует

Решение Было бы вам не нужно использовать Аллис на значение данных SET

UPDATE table Q SET is_active = FALSE ,is_delete = TRUE WHERE Q.name = 'XYZ';
Ронак Патель
источник
Привет Ронак, понизь твой ответ, как и для Postgres, и уже есть работающее решение для T-SQL выше.
Альпи Мураньи
hii @ AlpiMurányi, можете ли вы предложить мне, что является рабочим решением в моем случае. так что я могу реализовать, уже упоминал об ошибке в моем ответе
Ронак Патель
Уважаемый @Ronak, ваш случай отличается от оригинального постера, поэтому его следует обсудить в комментарии (не в ответе) или опубликовать как совершенно новый вопрос.
Альпи Мураньи