#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. Ага. я отредактировал спасибо тебе