由于我创建的日期为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之前订购?
答案 0 :(得分:2)
两件事。
因此有一个问题
SELECT to_char(created_date,'YYYY') "tour_year"
您已经用双引号引起了视图列的别名。在Oracle中,除非定义对象名称时用双引号引起来,否则对象名称均以大写形式存储,除非您使用双引号将它们括起来。基本上有2个选项。
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
语法。数十年来,不鼓励使用逗号进行隐式连接。