代码之家  ›  专栏  ›  技术社区  ›  Drew

Oracle:无法按with to\ u CHAR列排序

  •  -1
  • Drew  · 技术社区  · 6 年前

    查看:

    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\u year是一个无效的标识符,我认为Oracle不允许我这样做。这可能吗?或者我只能在创建日期前订购?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    查询不包括来自的任何列 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 语法。使用逗号的隐式连接几十年来一直不被鼓励。

        2
  •  2
  •   APC    6 年前

    因为这个问题

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

    您已对视图列的别名进行了双引号引用。在Oracle中,对象名都是大写的,不管定义它的表达式大小写如何,除非用双引号括起来。

    1. 删除视图定义中“旅游年”的引号并替换视图
    2. 如果你真的想用小写字母表示旅游年,你可以这样做 ORDER BY vt."tour_year" .

    我绝对推荐第一种选择。

    另一个重要的一点是,你应该使它成为一个习惯使用 a,b 联接的语法。

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