SQL Server 子查询返回多行:故障排除和解决方案
以下 SQL 查询举例说明了一个常见问题:子查询返回多个值,从而导致错误。
<code class="language-sql">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 </code>
执行此查询会导致错误:“子查询返回超过 1 个值。当子查询跟在 =、!=、、>= 后面或子查询用作表达式时,这是不允许的.”
问题:多行子查询结果
出现错误是因为子查询(SELECT supplier_item.price...)
可以返回多个price
值。 这是因为 WHERE
子句不能唯一标识每个 supplier_item
记录的单个 orderdetails
记录。 以这种方式使用的子查询需要一个明确的结果。
解决方案:使用 JOIN 进行高效数据检索
高效且正确的做法是用显式的JOIN
操作替换子查询:
<code class="language-sql">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'</code>
此修订后的查询使用 INNER JOIN
根据匹配的 OrderDetails
和 Supplier
连接 Group_Master
、Supplier_Item
、Sku
和 SupplierId
表。这可确保仅组合匹配的行,从而防止子查询返回多个值。 si.Price
直接选择为 cost
,为每个订单详细信息提供正确的价格。 在这种情况下,这种方法比使用相关子查询更加高效和可读。
以上是为什么 My SQL 子查询返回'子查询返回超过 1 个值”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!