sql >> Database >  >> RDS >> Oracle

ORA-00913:te veel waarden tijdens het gebruik van case when

Wanneer u een case . gebruikt , moet je slechts één record retourneren - niet meer dan 1. Om het gewenste resultaat te bereiken, zou ik een left outer join gebruiken (ervan uitgaande dat je een manier hebt om table1 aan table2) toe te voegen, maar voeg je check op table1.c1 toe aan de join-voorwaarde zodat tabel2-waarden alleen aanwezig zouden zijn als 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';

Deze oplossing gaat ervan uit dat tabel1 en tabel2 betrekking hebben. Als je ze niet kunt relateren, klinkt het bijna alsof je een union all kunt gebruiken waarin je alle waarden uit tabel1 neemt waar c1 ='1' en die samenvoegt met alle table2-rijen. Indien nodig kunt u tabel2-waarden alleen opnemen als c1 <> '1'.

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

UPDATE

Gebruik de tweede vraag hierboven op basis van uw voorbeeldgegevens en verwachte output:

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

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




  1. Mysql-functie om niet-null-waarden te transformeren

  2. Bereken de leeftijd in jaren in PostgreSQL

  3. Python, Brew en MySQLdb

  4. Fout-ORA-22835:Buffer te klein voor CLOB naar CHAR of BLOB naar RAW-conversie