当在子查询中使用MAX()时,“SQL Server子查询返回多于1个值”

问题描述:

我检查了尽可能多的问题,但找不到为什么发生这种情况的答案。当在子查询中使用MAX()时,“SQL Server子查询返回多于1个值”

我有一个查询:

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行?

我只是想了解推理和什么是建立这样的查询的最佳方式。

+0

您正在使用分组查询。这就是为什么它返回多个值。删除组并检查结果 – balaraman

我认为这是预期的

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

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

+0

男孩现在感觉像是n00b。我没有考虑到'group by'在技术上会导致多行,即使我通过'where'子句将结果过滤为单行 – Storm

group by的目的是启用聚合定义的组。您的group by导致为每个不同的值TCB2单独归还max(总计)。

看来你可能已经加入了group by而不理解它的作用。也许如果你告诉我们想要这样做,我们可以告诉你如何正确地做到这一点。

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