какова цель вложенного запроса, если результат может быть получен самим внутренним запросом

#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