SQL Server的子查询返回多个值。 这是当子查询跟随不允许=,!=,<,<=,

2019-05-10 09:12发布

我运行以下查询:

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

注意:当我们使用子查询必须着眼于点

  1. 如果我们的子查询在这种情况下返回一个值,我们使用(=,!=,<>,<,> ....)
  2. 其他(多个值)在这种情况下,我们使用(在,任何,所有,一些)


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项纪录
  2. 修复子查询,使得只返回一个记录
  3. 通过向子查询添加顶部1和顺序(即数据库管理员讨厌讨厌的解决方案 - 但它“作品”)
  4. 使用用户定义函数来连接子查询的结果为一个字符串


Answer 5:

解决方法是停止使用相关子查询和使用连接来代替。 相关子查询基本上游标,因为它们会导致查询运行一行一行地,应该避免。

您可能需要在一个派生表,以便让你在,如果你只想要一个记录进行匹配,如果你需要这两个值,则普通的场所需的值join会做,但你会得到相同的多个记录ID在结果集。 如果你只想要一个,你需要决定哪一个,做的是,在代码中,你可以使用一个top 1order 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 =, !=, <, <= , >, >=