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中文網其他相關文章!