我运行以下查询:
SELECT
orderdetails.sku,
orderdetails.mf_item_number,
orderdetails.qty,
orderdetails.price,
supplier.supplierid,
supplier.suppliername,
supplier.dropshipfees,
cost = (SELECT supplier_item.price
FROM supplier_item,
orderdetails,
supplier
WHERE supplier_item.sku = orderdetails.sku
AND supplier_item.supplierid = supplier.supplierid)
FROM orderdetails,
supplier,
group_master
WHERE invoiceid = '339740'
AND orderdetails.mfr_id = supplier.supplierid
AND group_master.sku = orderdetails.sku
我得到以下错误:
消息512,级别16,状态1,行2子查询返回多个值。 这是当子查询如下=,!=,<,<=,>,> =,或当子查询用作表达不允许的。
有任何想法吗?
Answer 1:
试试这个:
SELECT
od.Sku,
od.mf_item_number,
od.Qty,
od.Price,
s.SupplierId,
s.SupplierName,
s.DropShipFees,
si.Price as cost
FROM
OrderDetails od
INNER JOIN Supplier s on s.SupplierId = od.Mfr_ID
INNER JOIN Group_Master gm on gm.Sku = od.Sku
INNER JOIN Supplier_Item si on si.SKU = od.Sku and si.SupplierId = s.SupplierID
WHERE
od.invoiceid = '339740'
这将返回是除了相同的多个行cost
列。 看看返回的不同成本值,并找出是什么原因造成了不同的值。 然后问别人花费他们想要的价值,并添加标准,将选择费用查询。
Answer 2:
请检查是否有在桌子上,你试图对执行查询的触发器。 因为他们正试图运行更新/选择/插入触发器在桌子上,他们有时会抛出这个错误。
您可以修改您的查询禁用再启用触发若触发不需要为任何查询,你正在尝试运行被执行。
ALTER TABLE your_table DISABLE TRIGGER [the_trigger_name]
UPDATE your_table
SET Gender = 'Female'
WHERE (Gender = 'Male')
ALTER TABLE your_table ENABLE TRIGGER [the_trigger_name]
Answer 3:
SELECT COLUMN
FROM TABLE
WHERE columns_name
IN ( SELECT COLUMN FROM TABLE WHERE columns_name = 'value');
注意:当我们使用子查询必须着眼于点
- 如果我们的子查询在这种情况下返回一个值,我们使用(=,!=,<>,<,> ....)
- 其他(多个值)在这种情况下,我们使用(在,任何,所有,一些)
Answer 4:
cost = Select Supplier_Item.Price from Supplier_Item,orderdetails,Supplier
where Supplier_Item.SKU=OrderDetails.Sku and
Supplier_Item.SupplierId=Supplier.SupplierID
该子查询返回多个值,SQL抱怨,因为它不能分配多个值的单一记录成本。
一些想法:
- 修正数据,这样,现有的子查询只返回1项纪录
- 修复子查询,使得只返回一个记录
- 通过向子查询添加顶部1和顺序(即数据库管理员讨厌讨厌的解决方案 - 但它“作品”)
- 使用用户定义函数来连接子查询的结果为一个字符串
Answer 5:
解决方法是停止使用相关子查询和使用连接来代替。 相关子查询基本上游标,因为它们会导致查询运行一行一行地,应该避免。
您可能需要在一个派生表,以便让你在,如果你只想要一个记录进行匹配,如果你需要这两个值,则普通的场所需的值join
会做,但你会得到相同的多个记录ID在结果集。 如果你只想要一个,你需要决定哪一个,做的是,在代码中,你可以使用一个top 1
与order by
,你可以使用max()
你可以使用min()
等,这取决于你的对于数据真正的需求。
Answer 6:
无论您的数据是错误的,或者它不是结构化你觉得是这样的。 也许两者兼而有之。
为了证明/反驳这一假说,运行此查询:
SELECT * from
(
SELECT count(*) as c, Supplier_Item.SKU
FROM Supplier_Item
INNER JOIN orderdetails
ON Supplier_Item.sku = orderdetails.sku
INNER JOIN Supplier
ON Supplier_item.supplierID = Supplier.SupplierID
GROUP BY Supplier_Item.SKU
) x
WHERE c > 1
ORDER BY c DESC
如果返回短短几行,那么你的数据是错的 。 如果返回大量的行,那么你的数据不规整你认为它是这样的。 (如果它返回零行, 我错了。)
我猜,你必须包含相同的订单SKU
多次(两个独立的行项目,无论订购相同SKU
)。
Answer 7:
我有同样的问题,我用in
代替=
,从Northwind
数据库的例子:
查询:查找下了订单,1997年公司
试试这个 :
SELECT CompanyName
FROM Customers
WHERE CustomerID IN (
SELECT CustomerID
FROM Orders
WHERE YEAR(OrderDate) = '1997'
);
取而代之的是:
SELECT CompanyName
FROM Customers
WHERE CustomerID =
(
SELECT CustomerID
FROM Orders
WHERE YEAR(OrderDate) = '1997'
);
Answer 8:
在你选择的成本一部分的select语句返回多个值。 您需要添加更多的WHERE子句,或使用聚合。
Answer 9:
该错误意味着这个子查询返回超过1行:
(Select Supplier_Item.Price from Supplier_Item,orderdetails,Supplier where Supplier_Item.SKU=OrderDetails.Sku and Supplier_Item.SupplierId=Supplier.SupplierID )
你可能不希望包括子查询的ORDERDETAILS和供应商表,因为要引用来自外部查询这些表选择的值。 所以我想你想的子查询是简单的:
(Select Supplier_Item.Price from Supplier_Item where Supplier_Item.SKU=OrderDetails.Sku and Supplier_Item.SupplierId=Supplier.SupplierID )
我建议你在与非关联子查询相关阅读起来。
Answer 10:
正如其他人建议,要做到这一点,最好的方法是使用一个连接,而不是变量赋值。 重新写你的查询使用连接(使用显式连接语法,而不是隐式连接,其还建议 - 而且是最佳实践),你会得到这样的事情:
select
OrderDetails.Sku,
OrderDetails.mf_item_number,
OrderDetails.Qty,
OrderDetails.Price,
Supplier.SupplierId,
Supplier.SupplierName,
Supplier.DropShipFees,
Supplier_Item.Price as cost
from
OrderDetails
join Supplier on OrderDetails.Mfr_ID = Supplier.SupplierId
join Group_Master on Group_Master.Sku = OrderDetails.Sku
join Supplier_Item on
Supplier_Item.SKU=OrderDetails.Sku and Supplier_Item.SupplierId=Supplier.SupplierID
where
invoiceid='339740'
文章来源: SQL Server Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >=