Выполните итерацию результатов запросов Oracle SQL строка за строкой и создайте подзапросы, которые не выполняются эффективно

#sql #oracle #plsql #runtime

Вопрос:

Если у вас есть приведенный ниже запрос (упрощенный пример моего запроса, для удобства чтения):

 SELECT make, year, color, count(*)  FROM cars GROUPY BY make, year, color ORDER BY 4 DESC;  

Я хочу выполнить итерацию по результирующей таблице и создать подзапросы для критериев каждой строки (примеры ниже). Я надеюсь затем использовать эти подзапросы, чтобы создать единую таблицу с результатами выборки (возможно, 3 строки), которые соответствуют критериям каждой строки из исходных результатов запроса (например, поскольку с 2019 года есть несколько джипов черного цвета).

 SELECT * from cars  WHERE make = 'Jeep' AND year = '2019' AND color = 'Black';   SELECT * from cars  WHERE make = 'Ford' AND year = '2018' AND color = 'Red';  

Это может показаться странным или ненужным запросом. Однако я считаю, что это лучший подход, учитывая сложность моей реальной проблемы. Это подход, который я хочу использовать, так как мне нужно упрощенное решение, к которому я могу вернуться и изменить для использования в будущем и для различных вариантов запросов.

В настоящее время я использую ROW_NUMBER() для извлечения максимум трех строк на группу в качестве моего подхода (ниже). Хотя это компиляция для меня, она никогда не выполнялась до завершения, потому что у нее очень длительное время выполнения. Когда я выполняю процесс вручную (который я надеюсь автоматизировать с помощью этого запроса), время выполнения для получения желаемого результата не занимает слишком много времени (час или два). Однако, когда я запускаю это решение, оно остается запущенным в течение всего дня, а затем Oracle останавливает процесс в результате истечения времени ожидания подключения к базе данных. У кого-нибудь есть лучший подход к этой проблеме или, возможно, способ сделать это более эффективным?

 select * from (  select c.*,  row_number() over(partition by make, year, color order by id) as rn  from cars c ) x where rn lt;= 3  

ПРИМЕЧАНИЕ: Я использую Oracle SQL Developer

Комментарии:

1. вам нужны только операторы select ? или вы будете использовать эти запросы внутри процесса или функции ?

2. Я открыт для любого подхода, спасибо.

3. я ответил сейчас, так как у меня нет места для тестирования, вы можете проверить, работает ли это для вас

4. Спасибо за вашу идею, я надеюсь ограничить количество выборочных строк в группе до 3, и я не вижу этого в вашем подходе. Кроме того, ваш подход будет заключаться в извлечении всей таблицы cars, в отличие от результатов запроса из моего исходного запроса (первого на этой странице).

5. его можно легко добавить. я только что отредактировал свой ответ. вы можете проверить

Ответ №1:

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

 SELECT DISTINCT make, year, color,  'SELECT * from cars WHERE make =''' || make ||''' AND year = ''' || year ||''' AND color = ''' || color ||'''' AS SELECT_STATEMENTS FROM (select * from (  select c.*,  row_number() over(partition by make, year, color order by id) as rn  from cars c ) x where rn lt;= 3)  

Комментарии:

1. Вы захотите добавить больше кавычек вокруг столбцов, например make = ''' || make || '''

2. Ага. я отредактировал спасибо тебе