Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 子查询返回多个值错误_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 子查询返回多个值错误

Sql 子查询返回多个值错误,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在使用以下查询,但它抛出了一个错误。根据id的不同,它在某些情况下可以正常工作,但并非所有情况下都可以 子查询返回了多个值。这是不允许的,因为 子查询后面是=,!=,=或者当子查询用作 表情 它显示子查询返回多个值 您必须使用TOP关键字修改子查询,或按只返回一个值的“多个”提供“过滤器位置条件”和“顺序” While @i <= @NoOfRows Begin SET @Voucher_No=( select top 1 V_No from @TempT where Row

我正在使用以下查询,但它抛出了一个错误。根据id的不同,它在某些情况下可以正常工作,但并非所有情况下都可以

子查询返回了多个值。这是不允许的,因为 子查询后面是=,!=,=或者当子查询用作 表情


它显示子查询返回多个值

您必须使用TOP关键字修改子查询,或按只返回一个值的“多个”提供“过滤器位置条件”和“顺序”

While @i <= @NoOfRows
 Begin

   SET @Voucher_No=( select top 1 V_No from @TempT where RowID=@i)
   SET @Voucher_Type_No=( select top 1 voucher_type_no from @TempT where RowID=@i)
   SET @Voucher_Id=( select top1 Voucher_Id from @TempT where RowID=@i)
......
END

不要使用子查询设置变量,而是按如下所示设置变量

SELECT @NoOfRows = COUNT(*) FROM @TempT

WHILE @i <= @NoOfRows
BEGIN
    SELECT @Voucher_No = V_No FROM @TempT WHERE RowID=@i
    SELECT @Voucher_Type_No = voucher_type_no FROM @TempT WHERE RowID=@i
    SELECT @Voucher_Id = Voucher_Id FROM @TempT where RowID=@i
    SET @strPartyName=''

    SELECT @strPartyName =  Party_Name FROM Cheque_Book WHERE Voucher_No = @Voucher_No AND Voucher_Type_No = @Voucher_Type_No   AND Company_No=  @Comp_No   AND Bank_Account_No= @dbc_Account
    IF NULLIF(@strPartyName,'') IS NULL
    BEGIN
        SELECT @strPartyName = a.account_name FROM Voucher v INNER JOIN account a ON v.Account_No = a.account_No WHERE v.Voucher_Id= @Voucher_Id
        UPDATE @TempT SET Party_Name = @strPartyName WHERE RowID = @i
        SET @i = @i + 1
    END
END 
SELECT * FROM @TempT

我在这里看到以下查询失败的问题的答案,因为它们的子查询返回多个值:

SET @Voucher_No = (SELECT [V_No] FROM @TempT WHERE [RowID] = @i);
SET @Voucher_Type_No = (SELECT [voucher_type_no] FROM @TempT WHERE [RowID] = @i);
SET @Voucher_Id = (SELECT [Voucher_Id] FROM @TempT WHERE [RowID] = @i);
在这些答案中,主要有两种建议的解决方案:

SET@Variable=从[表格]中选择前1个[字段],其中。。。;,或 从[Table]中选择@Variable=[Field],其中。。。;。 令我惊讶的是,第二种方法被认为是首选方法。然而,有一些重要的事情需要考虑。

第一:如果SELECT查询返回多个结果,@Variable的值将成为查询结果集中最后检索到的值。当指定了ORDER BY条款时,必须考虑到这一点

因此,下面的查询将返回5而不是1:

第二:如果@Variable已经包含一个值,并且SELECT查询没有生成任何0行的结果,@Variable的值保持不变

因此,下面的查询将生成结果42而不是NULL:


出于所有这些原因,我个人的偏好是SET@Variable=selecttop1。。。方法。

您得到了什么错误?正如错误所说,任何select查询都会返回多个值,这就是您得到错误的原因?在每个select查询之后使用Print进行调试,以便您可以找到错误的确切位置或创建SQLFIDLE。您的select语句之一返回多个值,而不是返回单个值。尝试针对特定ID分别运行每个select语句。某些子查询返回的值大于。。分别执行子查询并verify@temp表返回200多行,调试每行的值几乎是不可能的。不管您的值是多少,您只需直接在另一个窗口上运行即可。或者只运行我的第二个选项,作为仅选择查询加载项while循环。尝试给出或执行一小部分结果,这些结果在运行@noofRows=1或give 2这样的查询之前就已经知道了
declare @department table (deptid int, name varchar(50))
declare @emp table (id int, name varchar(50), deptid int)

insert into @department values (1,'d1'), (2,'d2'),(3,'d3'),(4,'d4')
insert into @emp values(1,'ajay',1), (2,'ajay1',1),(3,'ajay3' ,2),(4,'ajay4' ,3),(5,'ajay5' ,4)


select * from @department where deptid = 1

/* suppose your sub-query like */
--1. this give result
select * from @department where deptid = (select deptid from @emp where id = 1)

--2. this give result, but may be get wrong result as it take top 1.
select * from @department where deptid = (select top 1 deptid from @emp )

--3. this give error same you have
select * from @department where deptid = (select deptid from @emp)

--to resolve the above error, just uncomment below sub-query.
--select deptid from @emp
SELECT @NoOfRows = COUNT(*) FROM @TempT

WHILE @i <= @NoOfRows
BEGIN
    SELECT @Voucher_No = V_No FROM @TempT WHERE RowID=@i
    SELECT @Voucher_Type_No = voucher_type_no FROM @TempT WHERE RowID=@i
    SELECT @Voucher_Id = Voucher_Id FROM @TempT where RowID=@i
    SET @strPartyName=''

    SELECT @strPartyName =  Party_Name FROM Cheque_Book WHERE Voucher_No = @Voucher_No AND Voucher_Type_No = @Voucher_Type_No   AND Company_No=  @Comp_No   AND Bank_Account_No= @dbc_Account
    IF NULLIF(@strPartyName,'') IS NULL
    BEGIN
        SELECT @strPartyName = a.account_name FROM Voucher v INNER JOIN account a ON v.Account_No = a.account_No WHERE v.Voucher_Id= @Voucher_Id
        UPDATE @TempT SET Party_Name = @strPartyName WHERE RowID = @i
        SET @i = @i + 1
    END
END 
SELECT * FROM @TempT
SET @Voucher_No = (SELECT [V_No] FROM @TempT WHERE [RowID] = @i);
SET @Voucher_Type_No = (SELECT [voucher_type_no] FROM @TempT WHERE [RowID] = @i);
SET @Voucher_Id = (SELECT [Voucher_Id] FROM @TempT WHERE [RowID] = @i);
DECLARE @TempTable TABLE ([ID] INT);
INSERT INTO @TempTable VALUES (1), (3), (2), (5), (4);

DECLARE @Variable INT = 42;
SELECT @Variable = [ID] FROM @TempTable ORDER BY [ID];

SELECT @Variable AS [@Variable];
DECLARE @TempTable TABLE ([ID] INT);
INSERT INTO @TempTable VALUES (1), (3), (2), (5), (4);

DECLARE @Variable INT = 42;
SELECT @Variable = [ID] FROM @TempTable WHERE [ID] = 6;

SELECT @Variable AS [@Variable];