2017-10-17 21 views
0

tableaux ont cette structure: groupTable> lineGroupJoinTable> linesTable (nom sont des noms brouillées) je la requête suivante qui renvoie cette erreur:inattendue « sous-requête retourné plus de 1 valeur »

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

La chose est que Je m'attends à ce que la sous-requête soit en groupe, je ne devrais pas avoir cette erreur. Il me manque probablement quelque chose.

UPDATE dbo.groupTable 
SET fieldToUpdate = CASE WHEN fieldToUpdate IS NULL THEN NULL ELSE 
(
    SELECT sumTable.fieldToSum FROM 
    dbo.groupTable gt 
    INNER JOIN 
    (
     SELECT lgjt.groupdId1, lgjt.groupdId2, SUM(lt.fieldToSum) as fieldToSum 
     FROM lineGroupJoinTable lgjt 
     INNER JOIN linesTable lt 
      ON 
       lt.fieldToSum IS NOT NULL AND lt.fieldToSum > 0 AND 
       lgjt.lineId1 = lt.lineId1 AND lgjt.lineId2 = lt.lineId2 
     GROUP BY lgjt.groupdId1, lgjt.groupdId2 

    ) sumTable 
    ON sumTable.groupdId1 = gt.groupdId1 AND sumTable.groupdId2 = gt.groupdId2 
) 
END 

Cette variation a été aussi essayer la suite d'une suggestion, mais revenir la même erreur:

UPDATE dbo.groupTable 
SET fieldToUpdate = CASE WHEN fieldToUpdate IS NULL THEN NULL ELSE 
(
    SELECT SUM(sumTable.fieldToSum) FROM 
    dbo.groupTable gt 
    INNER JOIN 
    (
     SELECT lgjt.groupdId1, lgjt.groupdId2, SUM(lt.fieldToSum) as fieldToSum 
     FROM lineGroupJoinTable lgjt 
     INNER JOIN linesTable lt 
      ON 
       lt.fieldToSum IS NOT NULL AND lt.fieldToSum > 0 AND 
       lgjt.lineId1 = lt.lineId1 AND lgjt.lineId2 = lt.lineId2 
     GROUP BY lgjt.groupdId1, lgjt.groupdId2 

    ) sumTable 
    ON sumTable.groupdId1 = gt.groupdId1 AND sumTable.groupdId2 = gt.groupdId2 
    GROUP BY gt.groupdId1, gt.groupdId2 
) 
END 

Répondre

0

Probablement parce que dbo.groupTable a une valeur multiple pour la ID1 combinaison et ID2. Je suggère de grouper sur la colonne id1 et id2 et faire une somme, dans ce cas vous aurez seulement 1 résultat.

UPDATE dbo.groupTable 
SET fieldToUpdate = CASE WHEN fieldToUpdate IS NULL THEN NULL ELSE 
(
    SELECT SUM(sumTable.fieldToSum) FROM 
    dbo.groupTable gt 
    INNER JOIN 
    (
     SELECT lgjt.id1, lgjt.id2, SUM(lt.fieldToSum) as fieldToSum 
     FROM lineGroupJoinTable lgjt 
     INNER JOIN linesTable lt 
      ON 
       lt.fieldToSum IS NOT NULL AND lt.fieldToSum > 0 AND 
       lgjt.id3 = lt.id3 AND lgjt.id4 = lt.id4 
     GROUP BY lgjt.id1, lgjt.id2 
    ) sumTable 
    ON sumTable.id1 = gt.id1 AND sumTable.id2 = gt.id2 
    GROUP BY gt.id1, gt.id2 
) 
END 
+0

J'ai essayé ceci, le résultat est similaire. Et étant donné que id1 et id2 sont une clé primaire, je ne m'attends pas à avoir plusieurs lignes par paire id1, id2. – TTT