JPL*_*mme 64 sql oracle alias decode ora-00904
我有一个查询,它旨在向我显示表A中的任何行,这些行最近还没有更新.(每行应在"month_no"之后的2个月内更新.):
SELECT A.identifier
, A.name
, TO_NUMBER(DECODE( A.month_no
, 1, 200803
, 2, 200804
, 3, 200805
, 4, 200806
, 5, 200807
, 6, 200808
, 7, 200809
, 8, 200810
, 9, 200811
, 10, 200812
, 11, 200701
, 12, 200702
, NULL)) as MONTH_NO
, TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
FROM table_a A
, table_b B
WHERE A.identifier = B.identifier
AND MONTH_NO > UPD_DATE
Run Code Online (Sandbox Code Playgroud)
WHERE子句中的最后一行导致"ORA-00904无效标识符"错误.不用说,我不想在WHERE子句中重复整个DECODE函数.有什么想法吗?(接受修复和变通方法......)
Tom*_*lak 108
这是不可能直接的,因为按时间顺序,WHERE发生在 SELECT 之前,它始终是执行链中的最后一步.
您可以对其进行子选择和过滤:
SELECT * FROM
(
SELECT A.identifier
, A.name
, TO_NUMBER(DECODE( A.month_no
, 1, 200803
, 2, 200804
, 3, 200805
, 4, 200806
, 5, 200807
, 6, 200808
, 7, 200809
, 8, 200810
, 9, 200811
, 10, 200812
, 11, 200701
, 12, 200702
, NULL)) as MONTH_NO
, TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
FROM table_a A
, table_b B
WHERE A.identifier = B.identifier
) AS inner_table
WHERE
MONTH_NO > UPD_DATE
Run Code Online (Sandbox Code Playgroud)
有趣的信息从评论中提升:
应该没有性能损失.在应用外部条件之前,Oracle不需要实现内部查询 - Oracle将考虑在内部转换此查询并将谓词下推到内部查询中,如果它具有成本效益,则会执行此操作.- 贾斯汀洞穴
小智 12
SELECT A.identifier
, A.name
, TO_NUMBER(DECODE( A.month_no
, 1, 200803
, 2, 200804
, 3, 200805
, 4, 200806
, 5, 200807
, 6, 200808
, 7, 200809
, 8, 200810
, 9, 200811
, 10, 200812
, 11, 200701
, 12, 200702
, NULL)) as MONTH_NO
, TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
FROM table_a A, table_b B
WHERE .identifier = B.identifier
HAVING MONTH_NO > UPD_DATE
Run Code Online (Sandbox Code Playgroud)