在子查询中使用MAX()时,“SQL Server子查询返回的值超过1”

时间:2015-10-13 11:26:23

标签: tsql sql-server-2012

我尽可能多地检查了一些问题,但是为什么会发生这种情况却找不到答案。

我有一个问题:

SELECT * 
FROM TableA
WHERE Col1 = 
(
    SELECT MAX( TBC1 )
    FROM TableB
    GROUP BY TBC2
)

会引发错误Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.但是当我将=运算符更改为IN时,它会愉快地通过。我还注意到在子查询中使用TOP(1)也可以解决问题。

从逻辑看,事实上在找到MAX之前首先返回的行列表导致SQL中的错误,即使MAX只会返回1行?< / p>

我只是想了解推理以及构建此类查询的最佳方法是什么。

3 个答案:

答案 0 :(得分:1)

你有一个小组。该查询将为每个不同的TBC2值返回一行。删除组。

答案 1 :(得分:1)

我认为这是预期的

您正在通过TBC2进行分组。在这种情况下,Max(tb1)将返回tbc2中每个不同值的最大值。

假设tbc1是employeeid,tbc2是dept。如果有100条记录,但它包含TBc2有三种类型的值,如dept1,dept2,dept3,那么上面的查询将返回3个值。

答案 2 :(得分:0)

group by的目的是在已定义的组上启用聚合。您的group by会导致max的每个不同值返回单独的TCB2(聚合)。

好像你可能在没有理解它的作用的情况下添加了group by。也许如果你告诉我们你尝试做什么,我们可以告诉你如何正确地做到这一点。