简体   繁体   English

什么导致“子查询返回超过 1 行”错误?

[英]What causes the "Subquery returns more than 1 row" error?

I'm trying to add a new Back Order to the Back Order table in my MYSQL database.我正在尝试向我的 MYSQL 数据库中的 Back Order 表添加一个新的 Back Order。 The problem I'm getting is that when I try to select the Supplier_ID to add it to the Back Order Table, the program gives me an error that says "Subquery returns more than 1 value".我遇到的问题是,当我尝试选择供应商 ID 以将其添加到延期交货表时,程序给我一个错误,提示“子查询返回的值超过 1”。

Supplier Table (Unsure how to properly structure it)供应商表(不确定如何正确构建它)

| | Supplier_ID |供应商_ID | SupName |名称 |

| | 1| 1| EWS |预警系统 |

| | 6 | 6 | Franklin Bakery |富兰克林面包店 |

Back Order Table延期交货表

| | BackOr_ID |返回Or_ID | Supplier_ID |供应商_ID | BackOr_Org_Date |返回Or_Org_Date | Sup_Name | Sup_Name |

The MYSQL query I'm currently using is:我目前使用的 MYSQL 查询是:

 CREATE DEFINER=`root`@`%` PROCEDURE `sp_BackOrder`( in supname varchar(50), in dat date ) BEGIN insert into Back_Order ( Supplier_ID, BackOr_Org_Date, Sup_Name ) values ( (select Supplier_ID from Supplier Where SupName = supname), dat, supname ); END

The C# Code that uses the query is:使用查询的 C# 代码是:

 MySqlCommand cmd = new MySqlCommand("sp_BackOrder", new MySqlConnection(*Connection String*)); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new MySqlParameter("supname", Supp_Name)); //Supp_Name is the Supplier Name (a string variable) cmd.Parameters.Add(new MySqlParameter("dat", DateTime.Now.ToShortDateString())); //dat is the date the Order is placed cmd.Connection.Open(); cmd.ExecuteNonQuery(); cmd.Connection.Close();

The only error I get is that the Subquery (Which I assume is the Select Query) returns more than 1 value.我得到的唯一错误是子查询(我假设是选择查询)返回超过 1 个值。 I've tried looking around and even looked on Stackoverflow but couldn't find any solution to the problem.我试过环顾四周,甚至查看 Stackoverflow,但找不到任何解决问题的方法。 Any help would be appreciated.任何帮助,将不胜感激。

It would need to look like:它需要看起来像:

delimiter $$
CREATE DEFINER=`root`@`%` PROCEDURE `sp_BackOrder`
(   in p_supname varchar(50),
    in p_dat date
)
BEGIN
    insert into Back_Order(Supplier_ID, BackOr_Org_Date, Sup_Name)
    select Supplier_ID, p_dat, p_supname from Supplier Where SupName = p_supname;
END$$
delimiter ;

or或者

CREATE DEFINER=`root`@`%` PROCEDURE `sp_BackOrder`
(   in p_supname varchar(50),
    in p_dat date
)
BEGIN
    insert into Back_Order(Supplier_ID, BackOr_Org_Date, Sup_Name)
    select Supplier_ID, p_dat, p_supname from Supplier Where SupName = p_supname;
END

Same deal in both just depending on your DELIMITER needs.根据您的DELIMITER需求,两者中的交易相同。

The parameter name supname of procedure and column name SupName are same.过程的参数名supname和列名SupName相同。 Change parameter name to something other than column name.将参数名称更改为列名称以外的名称。

CREATE DEFINER=`root`@`%` PROCEDURE `sp_BackOrder`(
in selectedSupname varchar(50),
in dat date
)
BEGIN
insert into Back_Order
(
Supplier_ID,
BackOr_Org_Date,
Sup_Name
)
values
(
(select Supplier_ID from Supplier Where SupName = selectedSupname),
dat,
selectedSupname
);

END

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM