Oracle:无法通过to_CHAR列排序

时间:2018-09-22 04:39:26

标签: sql oracle oracle12c

由于我创建的日期为DateTime格式,因此应用程序开发人员要求我根据created_date列修改查询并按年份对游览DESC进行排序,因此我尝试创建一个视图以将日期转换为显示日期的YEAR的列游览,看起来像这样:

查看:

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

以下是我需要更新的Package主体中的查询:

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不允许我这样做。这可能吗?还是只能在created_date之前订购?

2 个答案:

答案 0 :(得分:2)

两件事。

因此有一个问题

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 )

答案 1 :(得分:1)

该查询不包含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语法。数十年来,不鼓励使用逗号进行隐式连接。