Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak rozwiązać błąd ORA-01427 (podzapytanie jednowierszowe zwraca więcej niż jeden wiersz)?

Otrzymujesz błąd, ponieważ istnieje więcej niż jeden wiersz w db2.CENSUS dla co najmniej wartości uid . (Może być więcej.) Możesz dowiedzieć się, które wartości uid powodują problem, wykonując następujące czynności:

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

W tym momencie możesz zrobić wiele rzeczy. Możesz usunąć dodatkowe wiersze (może jest ich niewiele, a i tak ich nie chcesz) i zaktualizować tak, jak w pierwotnym zapytaniu, lub możesz użyć agregacji w podzapytaniu, którego używasz do aktualizacji, np.:

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

Ponadto w zapytaniu tak, jak powyżej, jeśli nie ma odpowiadającej wartości notes w db2.CENSUS dla pewnej wartości db1.CENSUS.uid , db1.CENSUS.notes zostanie ustawiony na NULL . Może takiego zachowania chcesz? Jeśli nie, będziesz potrzebować czegoś takiego:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Polecenie SQL ORA-00933 nie zostało poprawnie zakończone, ale dobre w programie SQL Developer

  2. aktualizowanie kolumny sygnatury czasowej sygnaturą czasową zawierającą „T”

  3. Jak WYBRAĆ wiele wartości z 5 tabel?

  4. Używanie obiektu java.sql.Timestamp w zapytaniu sql

  5. wywołać funkcję Oracle, która wstawia/aktualizuje z PHP?