Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie kann ich einen ORA-01427-Fehler beheben (Einzeilige Unterabfrage gibt mehr als eine Zeile zurück)?

Sie erhalten den Fehler, weil mehr als eine Zeile in db2.CENSUS vorhanden ist für mindestens den Wert uid . (Es könnten noch mehr sein.) Sie können herausfinden, welche Werte uid haben verursachen das Problem, indem Sie Folgendes tun:

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

An diesem Punkt können Sie eine Reihe von Dingen tun. Sie können die zusätzlichen Zeilen löschen (vielleicht sind es nicht so viele und Sie möchten sie sowieso nicht) und wie in Ihrer ursprünglichen Abfrage aktualisieren, oder Sie können die Aggregation in der Unterabfrage verwenden, die Sie zum Aktualisieren verwenden, z. P>

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';

Außerdem gilt bei Ihrer Abfrage wie oben, wenn es keinen entsprechenden Wert von notes gibt in db2.CENSUS für einen Wert von db1.CENSUS.uid , db1.CENSUS.notes wird auf NULL gesetzt . Vielleicht ist das das gewünschte Verhalten? Wenn nicht, möchten Sie etwas wie das Folgende:

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 );