错误1172:结果包含多行(在SQL中)

时间:2014-09-13 05:29:54

标签: mysql

我已经声明了变量(total,order_num,order_stts,id_cust,reMarks)。但它有错误,表示结果由多行组成。我该如何解决这个错误?请帮我修复这个错误,我是sql的新手。

从这段代码中可以完成以下几项任务:

 (1) update tble customer by setting the address to '90 TYT' if c_id= 1 
 (2) view order_no,status,c_id,item_total remarks. 
 (3) if item_total 0, then update table order_status by setting remarks = 'UNAVAILABLE',
         else select order_no,status,item_total,remarks where status = 'waiting'.


#drop procedure if exists usp_GetAnything;
delimiter //
create procedure usp_GetAnything()
begin

declare total int default 0;
declare order_num varchar(45) default 000;
declare order_stts varchar(45) default 000;
declare id_cust int default 0;
declare reMarks varchar (45) default 000;

select c_id,lname,address,city
from customer;
update customer
set address = '90 TYT'
where c_id = 1;

select o.order_no,o.o_status,c.c_id,o.item_total,o.remarks 
into  order_num,order_stts,id_cust,total,reMarks
from customer c, order_status o
where c.c_id=o.c_id;

    if (total > 0) then 
    update order_status o
    set reMarks = 'UNAVAILABLE'
    where order_num > '123';
    else  
    select order_num,order_stts,total,reMarks
    from order_status
    where order_stts = 'waiting';

end if;

end

2 个答案:

答案 0 :(得分:2)

错误是由第二个SELECT语句中的INTO子句引起的。如果SELECT返回的行不超过一行,那就不会出错。

但是如果SELECT返回多行,MySQL将抛出1172错误。 (您可以通过在“LIMIT 1”语句中添加“SELECT ... INTO”子句并验证是否未引发错误来对此进行测试。

该过程运行SELECT以返回结果集,然后发出UPDATE语句以修改表中的零行或多行。

该程序的下一部分令人困惑;目前尚不清楚我们正在努力实现的目标。 SELECT可以返回零,一行或多行。如果目的是执行条件测试以确定是否有任何行item_total > 0

然后一个可能的“修复”(以避免1172错误)将添加

AND o.item_total > 0 LIMIT 1

到“SELECT ... INTO”语句。

如果没有“ORDER BY”,则返回哪一行是不确定的。但它看起来并不重要。除了返回的o.item_total值的比较之外,对于返回的列,该过程看起来不像其他任何操作。

如果找到UPDATE行,则只会执行以下item_total>0语句。

UPDATE语句将更新所有行,其order_number大于指定的常量。

与前一个SELECT ... INTO语句返回的行似乎没有任何关系。

如果想要更新order_status中的行(与客户相关),如果上一个查询返回的“any”行有item_total > 0,则建议的“修复”将完成该操作。 / p>

然后(有条件地)过程返回第二个结果集(order_status中的所有行,其中`order_stts ='waiting'),但前提是没有任何order_status行和item_total> 0。

我们可以解决1172错误,但是这个程序比那个错误有更大的问题。整个过程似乎是解决它应该解决的任何问题的奇怪方法。它看起来像是一堆混乱的SQL语句,没有明确的设计。

答案 1 :(得分:0)

这意味着

select o.order_no,o.o_status,c.c_id,o.item_total,o.remarks 
from customer c, order_status o
where c.c_id=o.c_id; 

如果您尝试将结果存储在变量中,则上面的查询将返回多个不可加的行。因此,如果您不期望多行,请检查您的数据,或者如果您对第一行值没有问题,请在查询中添加限制1

select o.order_no,o.o_status,c.c_id,o.item_total,o.remarks 
into  order_num,order_stts,id_cust,total,reMarks
from customer c, order_status o
where c.c_id=o.c_id limit 1;

你可以尝试在Stackoverflow中搜索结果包含多行,你应该得到大量答案!!!