2016-07-20 3 views
2

У меня есть этот запрос, который возвращает элементы, которые необходимо удалить. Каким должен быть запрос для удаления этих элементов.Как удалить элементы из выбранного запроса?

SELECT p1.ID 
FROM pidata_load p1 
WHERE NOT EXISTS (SELECT p2.ID FROM pi_base p2 WHERE p1.pbid = p2.ID) 

Безопасно это сделать?

DELETE FROM pidata_load 
WHERE NOT EXISTS (SELECT p2.ID FROM pi_base p2 WHERE pbid = p2.ID) 
GO 

Update 1 - Вот мой запрос с псевдонимом на внешней таблице

DELETE p1 FROM pidata_load AS p1 WHERE NOT EXISTS (SELECT p2.ID FROM pi_base p2 WHERE p1.pbid = p2.ID) 
GO 
+1

Если ваш первый запрос возвращает нужные данные, тогда да, ваш второй запрос будет «удалять» эти строки. Вероятно, вы все равно должны относиться к внешней таблице, хотя ... – sgeddes

+1

Да, и это очень хорошая практика для проверки того, где перед выполнением удаления – Paparazzi

+0

Как бы я мог использовать внешнюю таблицу? –

ответ

2

Да, что будет работать. Оператор DELETE работает так же, как оператор SELECT, но он удаляет результаты.

0

Да, EXISTS действителен в условии WHERE заявления об исключении.

Вы также можете использовать IN для проверки идентификатора. Довольно уверен, что это менее эффективным чем EXISTS. По-моему, немного легче читать, но еще раз знаю, что это менее эффективно.

--With a query 
SELECT p1.ID 
FROM pidata_load p1 
WHERE p1.ID NOT IN (SELECT p2.ID FROM pi_base) 

--with regular values or parameters 
SELECT p1.ID 
FROM pidata_load p1 
WHERE p1.ID NOT IN (1,2,3,4) 
+0

Сначала вы были «Довольно уверены», но к концу вы «знаете».Кому нужны цитаты или доказательства, а? – onedaywhen

0

Да, definitely it safe использовать инструкцию delete вместо select.

Это good practice для проверки инструкции удаления с выбором перед выполнением.

Смежные вопросы