Comment puis-je résoudre un ORA-01427 erreur (une Seule rangée sous-requête renvoie plusieurs lignes)?
Ma requête retourne un ORA-01427 d'erreur et je ne sais pas comment le résoudre.
update db1.CENSUS set (notes)
=
(
select notes
from db2.CENSUS cen
where db1.CENSUS.uid = cen.uid
)
where headcount_ind = 'Y' and capture_FY = '2015'
- Le résultat dans le support DOIT retourner une seule ligne. Vous rencontrez cette erreur, car il est revenu plus d'une ligne.
Vous devez vous connecter pour publier un commentaire.
Vous obtenez l'erreur, car il existe plus d'une ligne dans
db2.CENSUS
pour au moins une valeur deuid
. (Il pourrait y en avoir plus.) Vous pouvez déterminer les valeurs deuid
sont à l'origine du problème en procédant comme suit:À ce point, vous pouvez faire un certain nombre de choses. Vous pouvez supprimer les lignes supplémentaires (peut-être il n'y en a pas beaucoup et vous ne voulez pas de toute façon) et la mise à jour comme dans la requête initiale, ou vous pouvez utiliser l'agrégation dans la sous-requête que vous utilisez pour mettre à jour, par exemple:
En outre, avec votre requête de la façon dont il est ci-dessus, si ce n'est pas une valeur correspondante de
notes
dansdb2.CENSUS
pour une certaine valeur dedb1.CENSUS.uid
,db1.CENSUS.notes
sera mis àNULL
. Peut-être que c'est le comportement que vous voulez? Si non, vous aurez envie de quelque chose comme ce qui suit:L'erreur signifie que la sous-requête
est de retour plus d'une ligne, avec des notes, tandis que l'instruction de mise à JOUR s'attend à une seule valeur à retourner.
Essayez les solutions suivantes.
Cela peut aussi vous donner la même erreur si il y a des entrées en double dans
db2.CENSUS
pour lauid
et oùheadcount_ind = 'Y' and capture_FY = '2015'
rapide et sale est
Mais, ce n'est probablement pas ce que vous voulez. Vous avez plus d'une note saisie par un membre de db1.DW_HRT_PERSONNEL_CENSUS.
Afin d'éviter cette erreur, vous devez connaître les relations entre les tables. Est-ce qu'un membre de db1.DW_HRT_PERSONNEL_CENSUS cartes à une seule note, ou, plus probablement, l'un des membres de db1.DW_HRT_PERSONNEL_CENSUS peut faire beaucoup de recensement des notes? Plus probable solution est:
FIN DE LA BOUCLE;
Vous pouvez également utiliser les fonctions d'analyse dans votre sous-requête comme
RANK() OVER (PARTITION BY recensement.uid de l'ORDRE de 1 DESC)
et choisissez le premier rang ou de second rang
Votre requête de mise à jour s'attend à l'intérieur de la requête se résoudre à un seul enregistrement, mais il est en fait un tableau. Si chaque résultat de la requête interne a la même valeur, vous pouvez le faire:
E. g.