97 votes

La sous-requête SQL Server a renvoyé plus d'une valeur. Ceci n'est pas autorisé lorsque la sous-requête suit =,! =, <, <=,>,> =

Une fois que je lance cette requête, j'obtiens l'erreur suivante.

  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
 

Msg 512, Niveau 16, Etat 1, Ligne 2 La sous-requête a renvoyé plus de 1 valeur. Ceci n'est pas autorisé lorsque la sous-requête suit =,! =, <, <=,>,> = Ou lorsque la sous-requête est utilisée comme expression.

Des idées?

59voto

Jeffrey L Whitledge Points 27574

Essaye ça:

 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'
 

Cela renverra plusieurs lignes identiques à l'exception de la colonne cost . Examinez les différentes valeurs de coût renvoyées et déterminez la cause de ces différentes valeurs. Puis demandez à quelqu'un quelle valeur de coût ils veulent, et ajoutez les critères à la requête qui sélectionnera ce coût.

54voto

jk. Points 10096

Vérifiez si la table sur laquelle vous essayez d'exécuter des requêtes contient des déclencheurs. Ils peuvent parfois émettre cette erreur alors qu'ils tentent d'exécuter le déclencheur update / select / insert qui se trouve sur la table.

Vous pouvez modifier votre requête pour la désactiver, puis l'activer si le déclencheur N'A PAS besoin d'être exécuté pour la requête que vous essayez d'exécuter.

 ALTER TABLE your_table DISABLE TRIGGER [the_trigger_name]

UPDATE    your_table
SET     Gender = 'Female'
WHERE     (Gender = 'Male')

ALTER TABLE your_table ENABLE TRIGGER [the_trigger_name]
 

34voto

Diyar sereroy Points 21
 select column 
from table 
where columns_name 
  in ( select column from table where columns_name = 'value');
 

remarque: lorsque nous utilisons une sous-requête, nous devons nous concentrer sur le point

  1. si notre sous requête retourne une valeur dans ce cas, nous utilisons (=,! =, <>, <,> ....)
  2. else (plus d'une valeur) dans ce cas, nous utilisons (dans, n'importe lequel, tous, certains)

13voto

Mayo Points 5532
cost = Select Supplier_Item.Price from Supplier_Item,orderdetails,Supplier 
   where Supplier_Item.SKU=OrderDetails.Sku and 
      Supplier_Item.SupplierId=Supplier.SupplierID

La sous-requête renvoie plusieurs valeurs, le SQL est de se plaindre car il ne peut pas affecter plusieurs valeurs de coût dans un seul enregistrement.

Quelques idées:

  1. Corriger les données telles que la sous-requête renvoie seulement 1 record
  2. Corriger la sous-requête telle qu'il retourne uniquement un enregistrement
  3. Ajouter un top 1 et de l'ordre par la sous-requête (méchant solution que les Administrateurs de bases de données par la haine, mais il ne "marche")
  4. L'utilisation d'une fonction définie par l'utilisateur pour concaténer les résultats de la sous-requête dans une seule chaîne

11voto

HLGEM Points 54641

La solution est d'arrêter d'utiliser des sous-requêtes corrélées et l'utilisation des jointures au lieu. Sous-requêtes corrélées sont essentiellement des curseurs, car elles provoquent la uery pour exécuter ligne par ligne et doit être évitée.

Vous pouvez avoir besoin d'une table dérivée de la rejoindre afin d'obtenir la valeur souhaitée dans le champ si vous voulez qu'un seul enregistrement pour le match, si vous avez besoin des deux valeurs puis les ordinalry rejoindre le fera, mais vous aurez plusieurs enregistrements pour le même id dans le jeu de résultats. Si vous n'en voulez un, vous devez décider de l'une et de le faire dans le code, vous pouvez utiliser un top 1 avec un order by, vous pouvez utiliser le max(), vous pouvez utiliser la fonction min(), etc, en fonction de ce que votre véritable exigence pour les données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X