"table or view does not exist" 和 "invalid identifier" 错误与 "with" 子句

"table or view does not exist" and "invalid identifier" errors with "with" clause

我使用 with 子句做了 3 个不同的查询:

WITH non_max_ratings as (
    SELECT rating
    FROM sailors
    WHERE rating<(SELECT MAX(rating) FROM sailors)
)
SELECT rating
FROM non_max_ratings nmr
WHERE rating=(SELECT max(rating) FROM nmr);

WITH non_max_ratings as (
    SELECT rating
    FROM sailors
    WHERE rating<(SELECT MAX(rating) FROM sailors)
)
SELECT rating
FROM non_max_ratings nmr
WHERE rating in nmr;

WITH non_max_ratings as (
    SELECT rating
    FROM sailors
    WHERE rating<(SELECT MAX(rating) FROM sailors)
)
SELECT rating
FROM non_max_ratings nmr
WHERE rating in nmr.rating;

这些查询只是毫无意义的测试stataments所以不要理会它们的功能。

第一个查询有编译错误:

WHERE rating=(SELECT max(rating) FROM nmr)
                                       *
ERROR at line 145:
ORA-00942: table or view does not exist

第二个查询有另一个错误:

WHERE rating in nmr
                 *
ERROR at line 154:
ORA-00904: "NMR": invalid identifier

第 3 次查询 运行 成功。

但根据我的了解,它们都应该正确执行,因为可以在同一查询中的任何位置访问使用 with 子句定义的派生关系。那为什么?

1 您无法从外部查询访问别名。

SELECT rating
FROM non_max_ratings nmr
WHERE rating=(SELECT max(rating) FROM nmr);

而是简单地使用

SELECT rating
FROM non_max_ratings nmr
WHERE rating=(SELECT max(rating) FROM non_max_ratings);

2 这是无效语法

SELECT rating
FROM non_max_ratings nmr
WHERE rating in nmr;

in 需要逗号分隔的值列表,例如

rating in ('value1', 'value2')