#mysql #sql
#mysql #sql
Вопрос:
Я начинающий уровень в SQL-запросах. Я хотел бы знать цель внешнего запроса, если результат может быть получен из самого внутреннего запроса. Как и в приведенном ниже случае, мы удаляем набор записей из таблицы, которые меньше определенной метки времени (другие условия сопоставления соответствуют уникальным ключам, но мне интересно, почему нам нужно проверять равенство уникальных ключей в одной таблице). Этот запрос написан для процесса очистки, мы удаляем записи из таблицы, которые старше определенной временной метки, и для получения дополнительной информации мы выполняем этот запрос из Java. Но мой вопрос заключается в том, чтобы понять цель внешнего запроса, если мы можем получить результат из самого внутреннего запроса.
Вложенный запрос, который мы имеем:
DELETE FROM ORDER_LOG T1
WHERE EXISTS (select *
FROM (SELECT VENDOR_NBR, ITEM_NBR, ORDER_ID, PDT_CODE, LOG_TS
FROM ORDER_LOG WHERE LOG_TS < "timestamp"
FETCH FIRST 100000 ROWS ONLY) AS T2
WHERE (T1.LOG_TS = T2.LOG_TS
AND T1.VENDOR_NBR= T2.VENDOR_NBR
AND T1.ORDER_ID=T2.ORDER_ID))
Не вложенный запрос (который я считаю исполняемым и выдает тот же результат):
DELETE FROM ORDER_LOG
WHERE LOG_TS< "timestamp"
FETCH FIRST 100000 ROWS ONLY
Ответ №1:
FETCH FIRST 100000 ROWS ONLY
не работает с DELETE
инструкцией, вам нужно сначала выбрать только эти строки, а затем удалить их. Ваш второй запрос удалит все записи, которые удовлетворяют условию LOG_TS< "timestamp"
Комментарии:
1. Спасибо за ваш ответ, из вашего ответа я полагаю, что данный вложенный запрос (где мы выбираем первые 100000 строк) предназначен для выполнения оператора ВЫБОРКИ, и мы удаляем выбранные строки из внешнего запроса, поэтому я хорошо разбираюсь во вложенном запросе для моего проекта. В общем, если я не укажу ВЫБОРКУ в запросе, удалит работу просто с предложением where типа ‘УДАЛИТЬ ИЗ ORDER_LOG, ГДЕ LOG_TS