Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment puis-je résoudre une erreur ORA-01427 (la sous-requête à une seule ligne renvoie plus d'une ligne) ?

Vous obtenez l'erreur car il existe plusieurs lignes dans db2.CENSUS pour au moins la valeur de uid . (Il pourrait y en avoir plus.) Vous pouvez déterminer quelles valeurs de uid sont à l'origine du problème en procédant comme suit :

SELECT uid, COUNT(*)
  FROM db2.census
 GROUP BY uid
HAVING COUNT(*) > 1;

À ce stade, vous pouvez faire un certain nombre de choses. Vous pouvez supprimer les lignes supplémentaires (il n'y en a peut-être pas beaucoup et vous n'en voulez pas de toute façon) et les mettre à jour comme dans votre requête d'origine, ou vous pouvez utiliser l'agrégation dans la sous-requête que vous utilisez pour mettre à jour, par exemple :

update db1.CENSUS set (notes)
=
(
        select MAX(notes)
        from db2.CENSUS cen
        where  db1.CENSUS.uid = cen.uid

)
where headcount_ind = 'Y' and capture_FY = '2015';

De plus, avec votre requête telle qu'elle est ci-dessus, s'il n'y a pas de valeur correspondante de notes dans db2.CENSUS pour une valeur de db1.CENSUS.uid , db1.CENSUS.notes sera défini sur NULL . C'est peut-être le comportement que vous souhaitez ? Sinon, vous voudrez quelque chose comme ce qui suit :

UPDATE db1.census c1
   SET c1.notes = ( SELECT max(c2.notes)
                      FROM db2.census c2
                     WHERE c2.uid = c1.uid )
 WHERE c1.headcount_ind = 'Y'
   AND c1.capture_FY = '2015'
   AND EXISTS ( SELECT 1 FROM db2.census c2
                 WHERE c2.uid = c1.uid );