SQL Server-Unterabfrage, die mehrere Zeilen zurückgibt: Fehlerbehebung und Lösung
Die folgende SQL-Abfrage veranschaulicht ein häufiges Problem: eine Unterabfrage, die mehr als einen Wert zurückgibt, was zu einem Fehler führt.
<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>
Das Ausführen dieser Abfrage führt zu folgendem Fehler: „Die Unterabfrage hat mehr als 1 Wert zurückgegeben. Dies ist nicht zulässig, wenn die Unterabfrage auf =, !=, <, >, >= folgt oder wenn die Unterabfrage als Ausdruck verwendet wird ."
Das Problem: Ergebnis einer Unterabfrage mit mehreren Zeilen
Der Fehler entsteht, weil die Unterabfrage (SELECT supplier_item.price...)
mehrere price
-Werte zurückgeben kann. Dies liegt daran, dass die WHERE
-Klausel nicht eindeutig einen einzelnen supplier_item
-Datensatz für jeden orderdetails
-Datensatz identifiziert. Eine auf diese Weise verwendete Unterabfrage erfordert ein einzelnes, eindeutiges Ergebnis.
Die Lösung: Verwendung von JOINs für einen effizienten Datenabruf
Der effiziente und korrekte Ansatz besteht darin, die Unterabfrage durch explizite JOIN
Operationen zu ersetzen:
<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>
Diese überarbeitete Abfrage verwendet INNER JOIN
, um OrderDetails
-, Supplier
-, Group_Master
- und Supplier_Item
-Tabellen basierend auf übereinstimmenden Sku
und SupplierId
zu verbinden. Dadurch wird sichergestellt, dass nur übereinstimmende Zeilen kombiniert werden, wodurch verhindert wird, dass die Unterabfrage mehrere Werte zurückgibt. Das si.Price
wird direkt als cost
ausgewählt und liefert für jedes Bestelldetail den korrekten Preis. Diese Methode ist in diesem Szenario weitaus effizienter und lesbarer als die Verwendung einer korrelierten Unterabfrage.
Das obige ist der detaillierte Inhalt vonWarum gibt meine SQL-Unterabfrage den Fehler „Unterabfrage hat mehr als 1 Wert zurückgegeben' zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!