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

时间:2014-07-13 10:32:19

标签: sql-server

我正在尝试使用if语句创建sql server过程。 我是ms sql server的新用户但是我尝试了以下语句,但它给了我以下错误消息116,级别16,状态1,过程te,第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

任何人都可以帮忙吗

1 个答案:

答案 0 :(得分:0)

如错误所示,使用IF条件时不能选择多列。在第一个IF条件中,您选择多个列,但是如果条件需要具有可导致一个值的查询。其他选择是您必须使用IF EXISTS,可以检查> 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

<强>更新

根据您的评论,我想您可以通过以下简单查询获得结果。

;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();