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>
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>
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!