Oracle: невозможно оформить заказ с помощью столбца to_CHAR - PullRequest
0 голосов
/ 22 сентября 2018

Разработчик приложения попросил меня изменить запрос и заказать тур DESC по годам на основе столбца create_date, поскольку дата создания имеет формат DateTime. Я попытался создать представление для преобразования даты в столбец, в котором отображается ГОД ГОДА.тур и это выглядит так:

VIEW:

CREATE VIEW vw.v_tour_year AS
SELECT to_char(created_date,'YYYY') "tour_year", tour_id, tour_name
FROM vw.tour

Вот запрос, который необходимо обновить из тела пакета:

SELECT tu.*
      FROM (
        SELECT t.tour_id, t.tour_name
        FROM vw.tour t
        WHERE NOT EXISTS (
          SELECT 'x'
          FROM vw.tour_locale l
          WHERE l.culture_id = 1
          AND l.tour_name IS NOT NULL
          AND t.tour_id = l.tour_id
        )     
        UNION
        SELECT l.tour_id, l.tour_name
        FROM vw.tour_locale l
        WHERE l.culture_id = 1
        AND l.tour_name IS NOT NULL
      ) tu, vw.v_tour_year vt
     WHERE tu.tour_id = vt.tour_id
     ORDER BY vt.tour_year desc, tu.tour_name asc;

Однако Oracle жалуетсяэтот vt.tour_year является недействительным идентификатором, который, я думаю, Oracle не позволяет мне.Это возможно?или я могу только заказать его по созданному_дате?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Запрос не содержит столбцы из vt.Лично я думаю, что это странно, сортировать что-то не в select.

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

SELECT tu.*,
       vt.created_date,
       to_char(vt.created_date, 'YYYY') as tour_year
FROM ((SELECT t.tour_id, t.tour_name
       FROM vw.tour t
       WHERE NOT EXISTS (SELECT 'x'
                         FROM vw.tour_locale l
                         WHERE l.culture_id = 1 AND
                               l.tour_name IS NOT NULL AND
                               t.tour_id = l.tour_id
                        )     
      ) UNION
      (SELECT l.tour_id, l.tour_name
       FROM vw.tour_locale l
       WHERE l.culture_id = 1 AND
             l.tour_name IS NOT NULL
      )
     ) tu JOIN
     vw.tour vt
     ON tu.tour_id = vt.tour_id
ORDER BY to_char(vt.created_date, 'YYYY') desc, tu.tour_name asc;

(Конечно, дополнительные столбцы в SELECT являются необязательными.)

Обратите внимание, что здесь также используется правильный стандартный явный синтаксис JOIN.Неявные объединения, использующие запятые, не поощрялись в течение десятилетий.

0 голосов
/ 22 сентября 2018

Две вещи.

Существует проблема из-за этого

SELECT to_char(created_date,'YYYY') "tour_year"

Вы дважды указали псевдоним для столбца представления.В Oracle все имена объектов хранятся с заглавной буквы независимо от случая выражения, которое его определило, если только вы не заключили их в двойные кавычки. В основном у вас есть 2 варианта.

  1. Удалите кавычки из "tour_year" в определении представления и замените представление
  2. Если вы действительно хотите, чтобы tour_year в нижнем регистре, вы могли бы сделать ORDER BY vt."tour_year".

Я бы определенно порекомендовал первый вариант.

Еще один важный момент заключается в том, что вы должны использовать привычку использования синтаксиса ANSI JOIN ниже вместо старого a,b синтаксис для объединений.

tu JOIN vw.v_tour_year vt
     ON ( tu.tour_id = vt.tour_id )
...