Maison > base de données > tutoriel mysql > Pourquoi ma sous-requête SQL renvoie-t-elle une erreur « La sous-requête a renvoyé plus d'une valeur » ?

Pourquoi ma sous-requête SQL renvoie-t-elle une erreur « La sous-requête a renvoyé plus d'une valeur » ?

Linda Hamilton
Libérer: 2025-01-17 15:06:10
original
161 Les gens l'ont consulté

Why Does My SQL Subquery Return a

Sous-requête SQL Server renvoyant plusieurs lignes : dépannage et solution

La requête SQL suivante illustre un problème courant : une sous-requête renvoyant plusieurs valeurs, entraînant une erreur.

<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>
Copier après la connexion

L'exécution de cette requête entraîne l'erreur : "La sous-requête a renvoyé plus d'une valeur. Ceci n'est pas autorisé lorsque la sous-requête suit =, !=, <, >, >= ou lorsque la sous-requête est utilisée comme expression. ."

Le problème : résultat de sous-requête sur plusieurs lignes

L'erreur se produit car la sous-requête (SELECT supplier_item.price...) peut renvoyer plusieurs valeurs price. En effet, la clause WHERE n'identifie pas de manière unique un seul enregistrement supplier_item pour chaque enregistrement orderdetails. Une sous-requête utilisée de cette manière nécessite un résultat unique et sans ambiguïté.

La solution : utiliser les JOIN pour une récupération efficace des données

L'approche efficace et correcte consiste à remplacer la sous-requête par des opérations JOIN explicites :

<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>
Copier après la connexion

Cette requête révisée utilise INNER JOIN pour connecter les tables OrderDetails, Supplier, Group_Master et Supplier_Item en fonction de la correspondance Sku et SupplierId. Cela garantit que seules les lignes correspondantes sont combinées, empêchant ainsi la sous-requête de renvoyer plusieurs valeurs. Le si.Price est directement sélectionné comme cost, fournissant le prix correct pour chaque détail de la commande. Cette méthode est bien plus efficace et lisible que l'utilisation d'une sous-requête corrélée dans ce scénario.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal