sql - Oracle:无法使用 to_CHAR 列排序
问题描述
应用程序开发人员要求我根据 created_date 列修改查询并按年份订购旅游 DESC,因为创建日期采用 DateTime 格式 我尝试创建一个视图以将日期转换为显示旅游年份的列及其看起来像这样:
看法:
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;
然而,甲骨文抱怨 vt.tour_year 是一个无效的标识符,我认为甲骨文不允许我这样做。这可能吗?或者我只能在 created_date 之前订购它?
解决方案
两件事情。
因为这个有一个问题
SELECT to_char(created_date,'YYYY') "tour_year"
您已双引号引用视图列的别名。在 Oracle 中,无论定义它的表达式的大小写如何,对象名称都存储为大写,除非您用双引号将它们括起来。您基本上有 2 个选项。
- 删除视图定义中“tour_year”中的引号并替换视图
- 如果你确实想要小写的 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 )
推荐阅读
- sql - 看起来相似的2个条件之间的差异
- react-native - 用函数或类反应原生屏幕?
- excel - 将 VBA 重写为与语言无关
- python - Tensorflow 2.4 无法在 Windows 10 上加载库
- awk - 如何使用 grep 或 awk 以这种模式提取数据?
- c++ - Vulkan:如何安全地替换 commandBuffer
- reactjs - 仅在测试中由 useEffect 引起的 React Maximum update depth exceeded 错误
- f# - WebSharper.UI.Next 丢失
- testng - 如何检测数据提供程序是否以并行模式运行
- mongodb - 如何在填充(猫鼬)中使用查找