【问题标题】:'WITH' clause does not work with in operator'WITH' 子句不适用于 in 运算符
【发布时间】:2021-08-20 13:37:54
【问题描述】:

我有一个简单的查询:

with MaxSal AS (SELECT MAX(Salary), DepartmentId FROM Employee GROUP BY DepartmentId)
SELECT Department.Name AS "Department", Employee.Name AS "Employee", Employee.Salary AS "Salary" FROM Employee
JOIN Department ON Department.Id = Employee.DepartmentId
WHERE (Employee.Salary, Employee.DepartmentId) in MaxSal;

它应该创建一个MaxSal 临时表,然后在WHERE 部分它应该检查Salary, DepId 是否在所述表内。不幸的是,这个查询给了我 ORA-00920: invalid relational operator 我猜是指 in 运算符。如果我直接放置子查询而不是先将其放入临时表中,一切都会按预期工作。
有人能告诉我为什么它不适用于WITH 子句吗?

【问题讨论】:

  • where (col1, col2) in tablename 从来都不是有效的 SQL,所以我不确定您为什么希望它在 CTE 的特殊情况下工作。 select * from dual where ('X','Y') in dual 适合你吗?

标签: sql oracle subquery common-table-expression


【解决方案1】:

您需要一个表引用来引用 CTE,而这又需要一个 FROM 子句。你可以使用子查询做你想做的事

WITH MaxSal AS (
      SELECT MAX(Salary) as max_salary, DepartmentId
      FROM Employee
      GROUP BY DepartmentId
     )
SELECT d.Name AS Department, e.Name AS Employee, 
       e.Salary AS Salary
FROM Employee e JOIN
     Department d
     ON d.Id = e.DepartmentId
WHERE (e.Salary, e.DepartmentId) in (SELECT max_salary, DepartmentId) FROM MaxSal);

也就是说,RANK() 要简单得多:

SELECT Department, Name AS Employee, Salary
FROM (SELECT e.*, d.Name as Department,
             RANK() OVER (PARTITION BY d.id ORDER BY e.Salary DESC) as seqnum
      FROM Employee e JOIN
           Department d
           ON d.Id = e.DepartmentId
     ) ed
WHERE seqnum = 1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 2011-01-10
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多