我无法理解WITH...AS 子句的工作原理。根据我的理解,它用于命名子查询,我可以在主查询中使用其名称来引用该子查询。但不知何故,下面的代码引发了“没有这样的列”错误:
WITH T1 AS (
SELECT MAX(EmployeeSalary)
FROM Employee
WHERE DepartmentName = 'Marketing'
GROUP BY DepartmentName
)
SELECT EmployeeName
FROM Employee
WHERE EmployeeSalary > T1;
表架构:
CREATE TABLE Employee (
EmployeeNumber SMALLINT UNSIGNED NOT NULL,
EmployeeName VARCHAR(10) NOT NULL,
EmployeeSalary INTEGER UNSIGNED NOT NULL,
DepartmentName VARCHAR(10) NOT NULL REFERENCES Department,
BossNumber SMALLINT UNSIGNED NOT NULL REFERENCES Employee,
PRIMARY KEY (EmployeeNumber));
样本数据:
1 Alice 75000 Management \N
2 Ned 45000 Marketing 1
3 Andrew 25000 Marketing 2
4 Clare 22000 Marketing 2
5 Todd 38000 Accounting 1
6 Nancy 22000 Accounting 5
7 Brier 43000 Purchasing 1
8 Sarah 56000 Purchasing 7
9 Sophie 35000 Personnel 1
10 Sanjay 15000 Navigation 3
11 Rita 15000 Books 4
12 Gigi 16000 Clothes 4
13 Maggie 16000 Clothes 4
14 Paul 11000 Equipment 3
15 James 15000 Equipment 3
16 Pat 15000 Furniture 3
17 Mark 15000 Recreation 3
有人可以告诉我为什么WITH...AS 子句在这种情况下不起作用吗?非常感谢!
不知何故,如果我用“IN”关键字替换“>”运算符(但当然不会返回正确的结果),或者如果我直接使用子查询,查询运行得很好,如下所示:
SELECT EmployeeName
FROM Employee
WHERE EmployeeSalary > (
SELECT MAX(EmployeeSalary)
FROM Employee
WHERE DepartmentName = 'Marketing'
GROUP BY DepartmentName
);
您需要为最大员工值指定别名,然后从子查询中的 CTE 中进行选择:
WITH T1 AS (
SELECT MAX(EmployeeSalary) AS maxsal
FROM Employee
WHERE DepartmentName = 'Marketing'
GROUP BY DepartmentName
)
SELECT EmployeeName
FROM Employee
WHERE EmployeeSalary > (SELECT maxsal FROM T1);
这是一种使用
INNER JOIN
来实现的方法:
WITH T1 AS (
SELECT MAX(EmployeeSalary) AS maxsal
FROM Employee
WHERE DepartmentName = 'Marketing'
)
SELECT EmployeeName
FROM Employee e
INNER JOIN T1 ON e.EmployeeSalary > maxsal
GROUP BY
是不必要的,因为我们已经按 DepartmentName 进行过滤。