Выполнение нескольких запросов SQL на одном CTE - PullRequest
0 голосов
/ 19 марта 2019

Вариант использования: Таблица базы данных отслеживает автомобили по многим. Каждый автомобиль должен осматриваться каждые три месяца. Когда я выбираю список автомобилей для проверки, я также хочу обновить их [Статус], чтобы отразить это. Это можно сделать, используя временную таблицу, но общее табличное выражение будет выполняться быстрее и будет иметь больше смысла, если его можно будет использовать таким образом.

Попытка решения:

WITH CTE AS (
    SELECT ID
    FROM [dbo].[CarInventory]
    WHERE <car requires inspection> )

SELECT ID
    FROM CTE;

UPDATE [dbo].[CarInventory]
    SET Status = 'Queued for inspection'
    WHERE ID IN (SELECT ID FROM CTE);

Оператор SELECT запустится, но я не могу найти способ использовать CTE в последующем операторе UPDATE. Есть ли способ выполнить SELECT и UPDATE с использованием CTE, чтобы мне не нужно было создавать временную таблицу?

Спасибо!

Ответы [ 4 ]

1 голос
/ 19 марта 2019

Я не понимаю. Почему вы выбираете id s? Просто сделай:

UPDATE ci
    SET Status = 'Queued for inspection'
    FROM [dbo].[CarInventory] ci;
    WHERE <car requires inspection> ;

Если вы хотите вернуть id s, которые затронуты, используйте предложение OUTPUT.

0 голосов
/ 20 марта 2019

Я просто лаял не то дерево, во-первых, используя CTE.Спасибо, что поправили меня!Кроме того, извините, чтобы оставить вас угадывать на программное обеспечение;Я использовал SSMS.

Используя предложение OUTPUT, рекомендованное Джо и Райаном, для обновления таблицы, а также просмотра сработавших записей.

UPDATE [dbo].[CarInventory]
SET Status = 'Queued for inspection'
OUTPUT Deleted.ID
WHERE <car requires inspection>

Я кратко ткнул в механику ПРОСМОТРА, которую предложил Джарлх.В данном случае это выглядит немного больше работы, чем OUTPUT, но я вдохновлен, чтобы узнать все об этом сейчас.

0 голосов
/ 19 марта 2019

Вы можете использовать предложение output оператора update, чтобы получить список после обновления.

https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-2017

0 голосов
/ 19 марта 2019

По внутреннему соединению CTE с таблицей, которую вы хотите обновить, вы обновите только те присоединенные записи.

WITH CTE AS 
    (
    SELECT ID
    FROM [dbo].[CarInventory]
    WHERE <car requires inspection>  
    )

UPDATE [dbo].[CarInventory]
    SET Status = 'Queued for inspection'
    OUTPut CTE.*
FROM [dbo].[CarInventory]
INNER JOIN CTE ON [dbo].[CarInventory].ID = cte.ID
...