该数据库正在使用SQL * Plus 11.2在Oracle Database 11g上运行。 WITH子句中是否不允许使用聚合方法,或者WITH做魔术?此代码告诉我“ most_expensive”是无效的标识符。但是,子查询没有问题。

WITH most_expensive AS (SELECT MAX (enrollment_cost) FROM Enrollments)
SELECT e.member_id
FROM Enrollments e
WHERE e.enrollment_cost = most_expensive;

最佳答案

查询分解(带有子句)使您可以定义临时表别名。
在您的示例中,most_expensive将引用一个表对象,该对象包含单行和单列。您可以在查询中可以使用表的任何地方使用它。
现在,如果您创建一个名为t1的表(带有create table语句),将其赋予一列并插入1行,您仍然将无法执行“ WHERE x = t1”。
换句话说,子查询并不总是与表相同,并且WITH子句为您提供的行为类似于表,而不是子查询。

但是,以下工作原理:

WITH most_expensive AS (SELECT MAX (enrollment_cost) FROM Enrollments)
SELECT member_id
FROM Enrollments e
WHERE e.enrollment_cost = (select * from most_expensive);


http://sqlfiddle.com/#!4/9eecb7/6340

10-06 05:38
查看更多