【问题标题】:SQL Server Referencing Nested SubqueriesSQL Server 引用嵌套子查询
【发布时间】:2012-02-12 20:42:38
【问题描述】:

在一个 sql server 数据库中,我正试图通过奖金返回最赚钱的性别。因此,我有一个子查询来计算每个性别的奖金总和,另一个子查询返回最大值,最后,我的主查询返回具有此最大值的性别。但是我的代码不起作用。

选择 E.Gender, maxx.mm

   FROM HumanResources.Employee as E, 
   (SELECT MAX(Bonus) as mm 
    FROM (SELECT E.Gender, SUM(SP.Bonus) AS Bonus 
          FROM HumanResources.Employee AS E, Sales.SalesPerson AS SP
          GROUP BY E.Gender) 
     AS gen) AS  maxx

其中 E.Gender = gen.Gender;

最后一行:其中 E.Gender = gen.Gender 似乎不起作用,因为 gen.Gender 无法绑定

请帮忙

【问题讨论】:

  • 你能展示样本数据和想要的结果吗?在Employee 和SalesPerson 之间是否还有一个共同的EmployeeID 列?现在你有一个错误的交叉连接(两个表但没有WHERE 子句)。

标签: sql-server-2008 join subquery


【解决方案1】:

我不是subquery(subquery(subquery( 模型的忠实粉丝,因为它通常很浪费并且通常难以解析/理解/重写。这是我最初看到它时想要重写的方式:

SELECT TOP (1) E.Gender, mm = SUM(SP.Bonus)
  FROM Sales.SalesPerson AS sp 
  INNER JOIN HumanResources.Employee AS E
  ON E.EmployeeID = sp.EmployeeID -- guess on relationship
GROUP BY E.Gender
ORDER BY mm DESC;

另一种方式(可能更有效,具体取决于计划,因为您将从加入中删除除一名员工之外的所有员工 - 可能发生上述情况,但也可能不会发生):

;WITH sp AS
(
  SELECT TOP 1 EmployeeID, mm = SUM(Bonus)
    FROM Sales.SalesPerson
    GROUP BY EmployeeID
    ORDER BY mm DESC
)
SELECT E.Gender, topsp.mm
  FROM sp
  INNER JOIN HumanResources.Employee AS E
  ON E.EmployeeID = sp.EmployeeID; -- again guessing on relationship

【讨论】:

  • 我猜有人不喜欢我的莫霍克。
【解决方案2】:

将您的过滤器放在子查询中。您可以从内部引用外部查询,因此:

 AS gen) AS  maxx

变成

 AS gen WHERE  E.Gender = gen.Gender) AS  maxx

【讨论】:

  • +1 您还必须将SELECT 列表从E.Gender 更改为maxx.Gender。但是我发现嵌套嵌套子查询模型无论如何都难以解析和理解(因此我的替代建议:-))。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
相关资源
最近更新 更多