当子查询没有引入 EXISTS 错误时,选择列表中只能指定一个表达式

Posted

技术标签:

【中文标题】当子查询没有引入 EXISTS 错误时,选择列表中只能指定一个表达式【英文标题】:Only one expression can be specified in the select list when the subquery is not introduced with EXISTS error 【发布时间】:2014-07-13 10:32:18 【问题描述】:

我正在尝试使用 if 语句创建 sql server 过程。 我是 ms sql 服务器的新手,但是我尝试使用以下语句,但它给了我以下错误 Msg 116, Level 16, State 1, Procedure te, Line 9 不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式。

这是我写的代码

CREATE PROCEDURE test as 
BEGIN
SET NOCOUNT ON;
if (select COUNT(load),load,contractor_id from [test].[dbo].[cont]
  group by load,contractor_id
  having load = (select MIN(load)from [test].[dbo].[cont])
   ) > 1 
  begin 
  SELECT top 1 COUNT(*),load ,contractor_id,name
  FROM [test].[dbo].[cont]
  group by load,contractor_id,name
  having load = (select MIN(load)from [test].[dbo].[cont])
  ORDER BY NEWID()
   end 
  ELSE
   BEGIN
  SELECT top 1 COUNT(*),load ,contractor_id,name
  FROM [test].[dbo].[cont]
  group by load,contractor_id,name
  having load = (select MIN(load)from [test].[dbo].[cont])
   END
END

GO

谁能帮忙

【问题讨论】:

你为什么不只是运行内部查询的ORDER BY NEWID() 变体并摆脱所有条件代码 - 除非我没有发现其他一些差异,你似乎正在做如果碰巧查询只返回一行,则需要做很多工作来避免应用ORDER BY 子句,这似乎是一项毫无意义的工作。 【参考方案1】:

正如错误所说,当您使用 IF 条件时,您不能选择多个列。在您的第一个 IF 条件中,您选择了多个列,但是如果条件需要有一个可以导致一个值的查询。其他选项是你必须使用 IF EXISTS,它可以检查 count >1 如下

IF (SELECT COUNT(load),load,contractor_id 
  FROM [test].[dbo].[cont]
  GROUP BY load,contractor_id
  HAVING load = (SELECT MIN(load)
                 FROM [test].[dbo].[cont])
  AND COUNT(load) >1)

我注意到的另一件事是您正在执行多次计算最小负载的查询。您可以通过将其存储在变量中并进一步使用它来避免这种情况。

我已将程序修改如下。检查这是否有效。

CREATE PROCEDURE test as 
BEGIN
SET NOCOUNT ON;
DECLARE @count INT
DECLARE @minload INT
SELECT @minload = MIN(load)from [test].[dbo].[cont]
SELECT @count = COUNT(load)  from [test].[dbo].[cont]
  GROUP BY load,contractor_id
  HAVING load = @minload

IF (@count) > 1 
  BEGIN 
      SELECT top 1 COUNT(*),load ,contractor_id,name
      FROM [test].[dbo].[cont]
      WHERE load = @minload
      GROUP BY load,contractor_id,name
      ORDER BY NEWID()
  END
ELSE
  BEGIN
      SELECT top 1 COUNT(*),load ,contractor_id,name
      FROM [test].[dbo].[cont]
      GROUP BY load,contractor_id,name
      HAVING load = @minload
  END
END

更新

根据你的 cmets,我想你可以通过一个简单的查询得到结果,如下所示。

;WITH minLoad(load)
AS
(
    SELECT MIN(load) 
    FROM [test].[dbo].[cont]

)
SELECT TOP 1 COUNT(*),c.load ,c.contractor_id,c.name
FROM [test].[dbo].[cont] c, minLoad
WHERE c.load = minLoad.load
ORDER BY NEWID();

【讨论】:

感谢您的支持。实际上,我正在尝试创建一个程序,该程序将为我提供具有以下逻辑的输出:我有一个承包商列表,每个承包商都有负载,我希望该程序检查:如果有负载较少的承包商,那么新工作将分配给他,否则如果有一组负载相同的承包商,则系统将随机选择其中一个。例如,我的列表中有 3 个承包商,其中两个具有相同的负载,每个承包商有 10 个工作,最后一个承包商有 15 个工作,因此系统将选择两者之一。希望你明白了 谢谢你,真的很有帮助。感谢您的合作:) 如何在asp页面中调用这个过程并在文本文件中显示输出? 您不需要程序。您可以像使用简单查询一样使用它。您可以将上述查询设置为 sqlcommand 对象的命令文本 感谢您与我在一起。我想要做的是有一个按钮客户端将按下按钮然后结果将显示在文本框中所以它可以是这样的吗?

以上是关于当子查询没有引入 EXISTS 错误时,选择列表中只能指定一个表达式的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 错误:当子查询没有用 EXISTS 引入时,选择列表中只能指定一个表达式

错误:不使用EXISTS引入子查询时,选择列表中只能指定一个表达式

当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式。 - 错误

我收到此错误:当未使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式

不使用EXISTS引入子查询时,选择列表中只能指定一个表达式--sql中的错误

创建函数时出错 - 如果不使用 EXISTS 引入子查询,则选择列表中只能指定一个表达式