Як написати 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, він працює.

Але мені потрібно використовувати псевдонім.


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 у пункті де.
Магнус

Це не псевдонім. Ось лише повністю кваліфікована назва "table.column": - /
ScottWelker

18

Ви завжди можете взяти підхід до CTE , (загальна таблична виразність).

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

UPDATE updateCTE
SET TITLE = 'TEST';

Так - це також працює. Але для програми JDBC / Java це своєрідний складний синтаксис. Дякую за Вашу відповідь.
javauser71

-1

Особливий випадок для Postgres

Перелік вищезазначених рішень для мене не працює. Отже, тут рішення для Postgres

Як я вогонь, мій запит

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

Результат: ПОМИЛКА: стовпець "q" співвідношення "таблиця" не існує

Вирішення проблеми Якщо вам не потрібно використовувати allis для значення даних SET

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

Привіт, Ронак, знижуючи свою відповідь, як це стосується Postgres, і вже є робоче рішення для T-SQL вище.
Alpi Murányi

привіт @ AlpiMurányi, ти можеш запропонувати мені, що працює в моєму випадку. щоб я міг реалізувати, Вже згадана помилка у своїй відповіді
Ronak Patel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.