Получение Ora-00903: неверное имя таблицы при создании календаря CTE в Oracle - PullRequest
0 голосов
/ 27 марта 2020

Вот мой код:

with calendar as
(
  select 
    to_date('1-jan-2019') + daynum as day_of_year, 
    Day_of_Week,
    rownum as Date_ID
  from 
    (
      select 
        rownum - 1 as daynum,
        to_char(to_date('1-jan-2019') + rownum - 1,'D') as Day_of_Week
      from 
        dual connect by rownum < sysdate - to_date('1-jan-2019') + 1000)
      where 
        day_of_week not in (1,7)
    ),

Мне нужно знать, почему я получаю эту ошибку и как ее исправить. Когда я запускаю его без 'С календарем как'

select to_date('1-jan-2019') + daynum as day_of_year,
  Day_of_Week,rownum as Date_ID
  from 
  (
    select 
    rownum - 1 as daynum,
    to_char(to_date('1-jan-2019') + rownum - 1,'D') as Day_of_Week
    from dual connect by rownum < sysdate - to_date('1-jan-2019') + 1000)
    where day_of_week not in (1,7)

Он запускается, и результаты

Результаты

Backend Story: Итак, я создаю правило для нашего SLA (Соглашение об уровне обслуживания). На нашем складе у нас есть определенное количество дней, чтобы получать заказы на причале. Таким образом, сгенерировав календарь и добавив правило «SLA» ниже, мы можем получить «by_date», показывающее, в какой день нам нужно иметь это на док-станции. когда заказ упал.

select distinct ord_num, max(sla) as sla from (
          select 
          h.ord_num,d10a.EDI_DATA_ID_VALUE as Order_TP, d10b.EDI_DATA_ID_VALUE as Augment,
            case when
            LOWER(d10b.EDI_DATA_ID_VALUE) LIKE '%shroud%' then 10
              when ord_lev1 in ('207347') then 4
              --Charles Cabinet
              when ord_lev1 in ('204611','204816','204819','205333','205818','205988') then 3
              --All Other cabinet IMNs or spare orders to cabinet
              when d10a.EDI_DATA_ID_VALUE = 'spare' then 0
              --SLA on spares, have to account for start date in another CTE
              else
              2
              end as sla --all other orders that arent charles, cabinet or a spare
      from e_ord_h h
      left join e_ord_d5 d5 on h.ord_num = d5.ord_num and d5.comp_code = 'S1'
      left join e_ord_D10 d10a on h.ord_num = d10a.ord_num and d10a.EDI_DATA_ID_DES = 'Capstan Order Type'and d10a.comp_code = 'S1'
      left join e_ord_D10 d10b on h.ord_num = d10b.ord_num and d10b.EDI_DATA_ID_DES = 'Capstan Augment'and d10b.comp_code = 'S1'
      where h.comp_code = 'S1' and flow_pros_code <> 'COOR' and ord_Stat = 'A'
      ) group by ord_num

Ответы [ 3 ]

0 голосов
/ 27 марта 2020

Это то, что у вас сейчас есть:

SQL> with calendar as
  2  (
  3    select
  4      to_date('1-jan-2019') + daynum as day_of_year,
  5      Day_of_Week,
  6      rownum as Date_ID
  7    from
  8      (
  9        select
 10          rownum - 1 as daynum,
 11          to_char(to_date('1-jan-2019') + rownum - 1,'D') as Day_of_Week
 12        from
 13          dual connect by rownum < sysdate - to_date('1-jan-2019') + 1000)
 14        where
 15          day_of_week not in (1,7)
 16      ),
 17  /
    ),
     *
ERROR at line 16:
ORA-00903: invalid table name


SQL>

Строка 16? Это

 16      ),

Видите что-нибудь подозрительное? Я делаю. Запятая здесь недействительна , но - это действительно так:

SQL> with calendar as
  2  (
  3    select
  4      to_date('1-jan-2019') + daynum as day_of_year,
  5      Day_of_Week,
  6      rownum as Date_ID
  7    from
  8      (
  9        select
 10          rownum - 1 as daynum,
 11          to_char(to_date('1-jan-2019') + rownum - 1,'D') as Day_of_Week
 12        from
 13          dual connect by rownum < sysdate - to_date('1-jan-2019') + 1000)
 14        where
 15          day_of_week not in (1,7)
 16      )
 17  select * From calendar
 18  where rownum < 5;

DAY_OF_YEAR D    DATE_ID
----------- - ----------
01-jan-2019 2          1
02-jan-2019 3          2
03-jan-2019 4          3
04-jan-2019 5          4

SQL>

(where здесь только для сокращения вывода).

0 голосов
/ 28 марта 2020

Всегда рискованно использовать TO_DATE() без спецификатора формата. Правильное использование будет

to_date('1-jan-2019', 'dd-mon-yyyy', 'NLS_DATE_LANGUAGE = american')

или проще с литералом DATE: DATE '2019-01-01'

Результат TO_CHAR(..., 'D') зависит от текущей настройки сеанса пользователя NLS_TERRITORY, он может измениться при любом время. Если вы хотите исключить субботу и воскресенье, лучше используйте это:

TO_CHAR(DATE '2019-01-01' + rownum, 'Dy', 'NLS_DATE_LANGUAGE = american') NOT IN ('Sat','Sun')

Это будет работать при любых условиях.

0 голосов
/ 27 марта 2020

Это работает для меня. Вы на самом деле не поделились всем своим запросом, поэтому я просто предположил, что вы поделились тем, что было наиболее важным.

База данных 12,2

with calendar as
(
  select 
    to_date('1-jan-2019') + daynum as day_of_year, 
    Day_of_Week,
    rownum as Date_ID
  from 
    (
      select 
        rownum - 1 as daynum,
        to_char(to_date('1-jan-2019') + rownum - 1,'D') as Day_of_Week
      from 
        dual connect by rownum < sysdate - to_date('1-jan-2019') + 1000)
      where 
        day_of_week not in (1,7)
    )
select * from calendar;

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...