sqlite:WITH...AS 子句的行为

问题描述 投票:0回答:2

我无法理解WITH...AS 子句的工作原理。根据我的理解,它用于命名子查询,我可以在主查询中使用其名称来引用该子查询。但不知何故,下面的代码引发了“没有这样的列”错误:

  • 预期结果:所有薪资高于市场部任何人的员工姓名(即Alice、Sarah)
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

);
sql sqlite
2个回答
1
投票

您需要为最大员工值指定别名,然后从子查询中的 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);

0
投票

这是一种使用

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 进行过滤。

演示在这里

© www.soinside.com 2019 - 2024. All rights reserved.