SQL-запрос - нужно несколько предложений - PullRequest
1 голос
/ 04 мая 2010

У меня есть таблица со списком кодов циклов. CYCLE_DEFINITION. каждый цикл_кода имеет 12-месячные записи в другой таблице (PM1_CYCLE_STATE). Каждый месяц имеет цикл_start_date и цикл_close_date. я проверю определенную дату (скажем, sysdate) и проверим текущий месяц каждого цикла. Кроме того, я также получу список следующих 3 месяцев этого цикла.

запрос, который я написал, выглядит следующим образом:

    SELECT cycd,cm,sd,ed,ld FROM (SELECT pcs.cycle_code CYCD,LTRIM(pcs.cycle_month,'0')+0 CM, pcs.cycle_start_date SD,pcs.cycle_close_date ED,ld.logical_date LD FROM pm1_cycle_state pcs,logical_date ld WHERE 
ld.logical_date BETWEEN pcs.cycle_start_date AND pcs.cycle_close_date and ld.logical_date_type='B')
UNION
SELECT cycd,cm,sd,ed,ld FROM (SELECT pcs.cycle_code CYCD,DECODE(LTRIM(pcs.cycle_month,'0')+1,13,1,14,2,15,3,LTRIM(pcs.cycle_month,'0')+1) CM ,pcs.cycle_start_date SD,pcs.cycle_close_date ED,ld.logical_date LD FROM pm1_cycle_state pcs,logical_date ld WHERE
ld.logical_date BETWEEN pcs.cycle_start_date AND pcs.cycle_close_date and ld.logical_date_type='B')
UNION
SELECT cycd,cm,sd,ed,ld FROM (SELECT pcs.cycle_code CYCD,DECODE(LTRIM(pcs.cycle_month,'0')+2,13,1,14,2,15,3,LTRIM(pcs.cycle_month,'0')+2) CM ,pcs.cycle_start_date SD,pcs.cycle_close_date ED,ld.logical_date LD FROM pm1_cycle_state pcs,logical_date ld WHERE
ld.logical_date BETWEEN pcs.cycle_start_date AND pcs.cycle_close_date and ld.logical_date_type='B')
UNION
SELECT cycd,cm,sd,ed,ld FROM (SELECT pcs.cycle_code CYCD,DECODE(LTRIM(pcs.cycle_month,'0')+3,13,1,14,2,15,3,LTRIM(pcs.cycle_month,'0')+3) CM ,pcs.cycle_start_date SD,pcs.cycle_close_date ED,ld.logical_date LD FROM pm1_cycle_state pcs,logical_date ld WHERE 
ld.logical_date BETWEEN pcs.cycle_start_date AND pcs.cycle_close_date and ld.logical_date_type='B')

Этот запрос работает отлично. Это приведет ко всем циклам с ровно четырьмя строками для текущего месяца и следующих 3 месяцев.

Теперь требуется, чтобы отсутствовал какой-либо месяц. Как я могу показать это? например: результат вышеупомянутого запроса

cycd  cm
102 1
102 10
102 11
102 12
103 1
103 10
103 11
103 12
104 1
104 10
104 11
104 12

Теперь допустим, что строка с cycd = 104 и cm = 11 отсутствует в таблице, тогда вышеприведенный запрос не получит строку 104 11. Я хочу отображать только эти строки. как я мог это сделать?

Ответы [ 2 ]

0 голосов
/ 04 мая 2010

Я получил еще один лучший подход, если много думать. если у меня есть список, подобный этому:

102 1
102 10
102 11
102 12
103 1
103 10
103 11
103 12

тогда я также могу получить список существующих записей в таблице, как показано ниже (допустим, 103 11 не присутствует в таблице). Теперь мой результат запроса будет таким, как показано ниже

102 1
102 10
102 11
102 12
103 1
103 10
103 12

, так как у меня есть два вышеупомянутых списка, я могу просто сделать минус из двух запросов и получить требуемый результат в соответствии с заданным вопросом. И я сделал то же самое. И я получил ожидаемый результат. Вы хотите увидеть запрос!

0 голосов
/ 04 мая 2010

Создайте таблицу, содержащую месяцы с 1 по 12, перекрестные месяцы соединения с pm1_cycle_state и оставьте соединение с вашим оператором выбора (возможно, в виде представления):

SELECT pm1_cycle_state.cycle_code, months.month
FROM pm1_cycle_state
CROSS JOIN months
LEFT OUTER JOIN V_Cycle_Months 
    ON V_Cycle_Months.cycd = pm1_cycle_state.cycle_code
    AND V_Cycle_Months.cm = months.month
WHERE V_Cycle_Months.cycd IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...