再会,
这个难倒我了。我有一个相当讨厌的开发人员查询,我想将其存储在非物化的 Oracle 视图中。视图本身的文本在这里列出有点长,但它编译得很好并生成正确的结果集。视图查询本身使用 CTE 以及两个手动逆透视(UNPIVOT 运算符在 Oracle 10 中不可用)和相当多的 UNION。这个想法是重复使用每个 CTE '中间' 查询来提取各种聚合,否则这些聚合在单个查询中是不可能的(糟糕的数据库设计,不幸的是我无法控制)。需要许多聚合,这是我在速度、可维护性和可读性/自文档化代码方面可以提出的最佳解决方案。
现在,当我做一个简单的
SELECT *
FROM myView;
Run Code Online (Sandbox Code Playgroud)
但是,每当我尝试过滤结果时,WHERE 子句似乎都被忽略了。类似的东西
SELECT *
FROM myView
WHERE DATA_TYPE = 3; -- <== There is no DATA_TYPE = 3 in the result set
Run Code Online (Sandbox Code Playgroud)
仍然返回所有行,而它应该什么都不返回。涉及任何其他列的其他谓词似乎也被忽略。知道什么可能导致这种情况吗?上面的 SELECT 执行得很好,没有给出错误。
作为参考,DBMS 是 Oracle 10g。
提前感谢您的任何帮助。
编辑:
仍然展示相同行为的视图查询的精简版本如下(在 CTE 的内部和外部部分有更多的查询,为了紧凑,我只包含了两个内部和一个外部):
CREATE OR REPLACE VIEW FSA.FSA_V_DB_TOTALS
(
DATA_CATEGORY, DATA_TYPE, HUMAN_STRING, ELEMENT_NAME, ELEMENT_VAL,
CLASS_CD, REGION, CNTY, DIST, TRA, FRAN, PROP
)
AS
WITH
--Queries to generate intermediate result sets …Run Code Online (Sandbox Code Playgroud)