#sql #oracle #plsql
#sql #Oracle #plsql
Вопрос:
Пожалуйста, мне нужна помощь, чтобы вставить результат одного запроса в другой запрос и вернуть результат, как обычный оператор select
первый запрос:
select distinct due_dt
from ln_acct_repmnt_event
order by 1 asc
затем я хочу передать due_dt во второй запрос, который должен выполнять цикл для как можно большего количества записей при возврате первого запроса:
select TO_DATE(due_dt, 'DD/MM/RRRR') as date1,
EXTRACT(YEAR FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS YEAR,
EXTRACT(MONTH FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS MONTH
FROM dual;
и я хочу, чтобы результат был возвращен.
Пожалуйста, есть идеи?
Комментарии:
1. Зачем вам здесь нужен цикл? просто используйте второй запрос, но замените
from dual
tofrom ln_acct_repmnt_event
. Или вам нужно что-то еще?2. Вероятно, конструкция, которую вы ищете, — это курсор ДЛЯ цикла . Является ли это хорошим подходом здесь, зависит от того, что вы пытаетесь с ним сделать. Как сказал @Sujitmohanty30, в приведенном вами примере было бы лучше объединить два в один запрос без необходимости каких-либо циклов.
3. Побочное наблюдение: почему вы применяете TO_DATE к DUE_DT? DUE_DT уже должен иметь тип данных DATE . Если это не так, это ошибка дизайна номер один. И если это (как и должно быть) уже ДАТА, применение TO_DATE сначала вызовет подразумеваемый TO_CHAR и высокий риск неправильного сопоставления NLS_DATE_FORMAT . Кроме того, формат RRRR был задуман как временное исправление для Y2K — двадцать лет назад ! Выбросьте это из своих мыслей.
Ответ №1:
Я думаю, это все, что вам нужно:
WITH duedatesdistinct
AS (SELECT DISTINCT due_dt
FROM ln_acct_repmnt_event)
SELECT due_dt,
TO_DATE(due_dt, 'DD/MM/RRRR') AS date1,
EXTRACT(year FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS year,
EXTRACT(month FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS month
FROM duedatesdistinct
ORDER BY 1 ASC;
Ответ №2:
Просто используйте логику даты в первом запросе:
SELECT DISTINCT TO_DATE(due_dt, 'DD/MM/RRRR') as date1,
EXTRACT(YEAR FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS YEAR,
EXTRACT(MONTH FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS MONTH
FROM ln_acct_repmnt_event
ORDR BY 1 ASC;
Если вы действительно хотите, вы можете использовать подзапрос:
SELECT TO_DATE(due_dt, 'DD/MM/RRRR') as date1,
EXTRACT(YEAR FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS YEAR,
EXTRACT(MONTH FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS MONTH
FROM (SELECT DISTINCT due_dt
FROM ln_acct_repmnt_event
) a
ORDR BY 1 ASC;
Но подзапрос не нужен.
Ответ №3:
Если вам действительно нужен цикл, используйте цикл for и объедините свой запрос следующим образом.
For rec in (SELECT DISTINCT
TO_DATE(due_dt, 'DD/MM/RRRR') as date1,
EXTRACT(YEAR FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS YEAR,
EXTRACT(MONTH FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS MONTH
FROM ln_acct_repmnt_event
ORDR BY 1 ASC)
Loop
-- the logic which need to be written
End loop;