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

ORA-00913:Zu viele Werte bei Verwendung von Case When

Wenn Sie einen case verwenden , müssen Sie nur einen einzigen Datensatz zurückgeben - nicht mehr als 1. Um Ihr gewünschtes Ergebnis zu erzielen, würde ich einen linken äußeren Join verwenden (vorausgesetzt, Sie haben eine Möglichkeit, table1 mit table2 zu verknüpfen), aber fügen Sie Ihre Prüfung auf table1.c1 in die ein join-Bedingung, sodass table2-Werte nur vorhanden sind, wenn c1 <> '1'

select
    coalesce(table2.c1, table1.c1) c1,
    coalesce(table2.c2, table1.c2) c2,
    coalesce(table2.c3, table1.c3) c3
from table1
    left outer join table2
       on (your keys here)
           and table1.c1 <> '1' -- This gets table1 if c1 = '1';

Diese Lösung geht davon aus, dass sich Tabelle1 und Tabelle2 beziehen. Wenn Sie sie nicht in Beziehung setzen können, klingt es fast so, als könnten Sie eine Vereinigung all verwenden, in der Sie alle Werte aus Tabelle1 nehmen, wobei c1 ='1' ist, und diese mit allen Zeilen von Tabelle2 vereinigen. Falls erforderlich, könnten Sie table2-Werte nur dann einschließen, wenn c1 <> '1'.

select c1, c2, c3 from table1 where c1 = '1'
union all
select c1, c2, c3 from table2; -- where c1 <> '1' -- if necessary

AKTUALISIEREN

Verwenden Sie basierend auf Ihren Beispieldaten und der erwarteten Ausgabe die zweite obige Abfrage:

select c1, c2, c3 from table1 where c1 = '1'
union all
select c1, c2, c3 from table2 where c1 <> '1'

SQL-Geige:http://www.sqlfiddle.com/#!4/ 710f0/1/0