【问题标题】:Only one expression can be specified in the select list when the subquery is not introduced with Exists?不使用 Exists 引入子查询时,选择列表中只能指定一个表达式?
【发布时间】:2018-04-14 12:02:07
【问题描述】:

我遇到了一个错误:-

"不引入Exists子查询时,选择列表中只能指定一个表达式"

我不知道为什么。有人可以指出我正确的方向吗?谢谢

DECLARE @summationhoursint NVARCHAR(MAX);
SET @summationhours =
(
    SELECT SUM(hours),
           month,
           firstName
    FROM #temp
    WHERE month = 'january-2017'
          AND firstName = 'Mike'
    GROUP BY month,
             firstName
);
PRINT @summationhours;

【问题讨论】:

  • 您在 @summationhours 中返回多个列值。所以,选择查询应该返回原子值

标签: sql sql-server tsql


【解决方案1】:

您可以使用以下查询返回多列,问题是它只会返回一行。很可能是结果列表中的最后一行。如果您需要查询中的所有行,我建议您将其选择到临时表中并将其作为一个集合使用。

DECLARE @summationhours int ;
DECLARE @Mon int;
DECLARE @FName varchar(100);

SELECT @summationhours = hrs, @Mon = mn, @Fname = firstName from
(
    SELECT SUM(hours) hrs,
           month mn,
           firstName
    FROM #temp
    WHERE month = 'january-2017'
          AND firstName = 'Mike'
    GROUP BY month,
             firstName
) t1;
PRINT @summationhours;

【讨论】:

    【解决方案2】:

    当您编写子查询并希望分配一个标量值时,您不能返回多于一列和多于一行。

    您没有同时遵守这两个约束,因为:

    • 您的 SELECT 字段列表有 3 个字段:SUM(hours), month, firstName
    • 您的子查询有一个GROUP BY 子句,因此每个值组合month, firstName 都有一行。

    如果您想分配您的总小时数,您可以使用 Serge 解决方案,但如果您想在问题中根据需要管理结果,则必须将这三个信息与其他表或类似解决方案一起放入 JOIN 中。请添加更多详细信息,以便我为您提供帮助。

    【讨论】:

      【解决方案3】:

      SELECT 语句中不能有多个列。试试这个:

      DECLARE @summationhours INT
      
      SET @summationhours= (
        SELECT SUM(hours)
        FROM #temp
        WHERE month = 'january-2017'
        AND firstName = 'Mike'
        )
      
      PRINT @summationhours
      

      【讨论】:

        猜你喜欢
        • 2011-09-24
        • 2012-12-04
        • 2020-01-24
        • 1970-01-01
        相关资源
        最近更新 更多