【问题标题】:SQL combining two queries inside the same table without a subquerySQL在没有子查询的情况下在同一个表中组合两个查询
【发布时间】:2017-10-20 13:30:10
【问题描述】:

一张表,Employee 有列 EmployeeID,Salary。 如何找到工资高于平均工资的 EmployeeID?

使用子查询:

SELECT EmployeeID
FROM Employee
WHERE Salary > (SELECT AVG(Salary)
                 FROM Employee);

是否可以使用连接? 还有其他方法吗?

【问题讨论】:

  • 这是可能的,但是在这种情况下,为什么你想要一个没有子查询的查询呢?我在这里感觉到X-Y problem
  • @TT 因为所有子查询也可以使用连接解决?
  • 不,事实并非如此。如果您要重写以使用“某物”进行联接,则该某物将是派生表,它是一个子查询,它在联接子句中代替表。不过,我看不出您为什么要以不同的方式编写它的原因。 IMO 在您的问题中的编写方式是在 SQL 中表达这一点的正确方法。

标签: sql sql-server subquery


【解决方案1】:

这样写对我来说似乎很愚蠢,但是这里没有任何子查询:

SELECT a.EmployeeID
FROM Employee a
CROSS JOIN Employee b
GROUP BY a.EmployeeID, a.Salary
HAVING a.Salary > AVG(b.Salary)

【讨论】:

  • 那么正常情况下,一个应该使用子查询吗?
  • 除了子查询之外,我从未见过它以任何方式编写(无论是您最初编写它的方式,还是@StanislavL 在他们的答案中编写它的方式),所以这些对我来说似乎更熟悉.这只是一个偏好问题。
  • 也许 SQL Server 可以优化到相同的执行计划,尽管我对此表示怀疑。这可能真的会交叉连接两个表,给出行数的平方,必须按两个字段对其进行分组等。提出这个的道具,但我不会用十英尺的杆子碰它。
【解决方案2】:
SELECT EmployeeID
FROM Employee, (SELECT AVG(Salary) avg_savary
                 FROM Employee) sal
WHERE Salary > sal.avg_savary;

将平均工资计算移至 FROM 以计算一次。顺便说一句,大多数现代数据库都可以优化您的查询以计算一次。

【讨论】:

  • 这使用了子查询,不是吗?
  • @JacobH 是否可以不使用连接或子查询?
  • @JacobH 从技术上讲你是对的 - 我的答案有一个子查询。 Josh 的回答在技术上是正确的,没有子查询,但速度要慢得多。
【解决方案3】:
SELECT * from 
(SELECT EmployeeID,salary AVG(salary) OVER() avg_salary FROM Employee) 
WHERE Salary >avg_salary

【讨论】:

  • 不,我使用 Windows 函数,除非你的意思是派生表
【解决方案4】:
SELECT e.EmployeeID FROM Employee e
JOIN
(
 SELECT avg(Salary) as Salary FROM Employee
) e1
ON e.Salary > e1.Salary

【讨论】:

  • 这有一个子查询。
【解决方案5】:
Declare @AverageSalary as Money
Select @AverageSalary = AVG(Salary) From Employee
Select * from Employee Where Salary > @AverageSalary

【讨论】:

    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2012-03-25
    • 2021-11-12
    相关资源
    最近更新 更多