Heim > Datenbank > MySQL-Tutorial > Warum gibt meine SQL-Unterabfrage den Fehler „Unterabfrage hat mehr als 1 Wert zurückgegeben' zurück?

Warum gibt meine SQL-Unterabfrage den Fehler „Unterabfrage hat mehr als 1 Wert zurückgegeben' zurück?

Linda Hamilton
Freigeben: 2025-01-17 15:06:10
Original
161 Leute haben es durchsucht

Why Does My SQL Subquery Return a

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage