Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

ORA-00913:muitos valores ao usar case quando


Quando você usa um case , você deve retornar apenas um único registro - não mais que 1. Para obter o resultado desejado, eu usaria uma junção externa esquerda (supondo que você tenha uma maneira de unir tabela1 a tabela2), mas adicione sua verificação em tabela1.c1 no condição de junção para que os valores da tabela2 só estejam presentes se 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';

Esta solução assume que a tabela1 e a tabela2 estão relacionadas. Se você não pode relacioná-los, então parece que você pode usar uma união all na qual você pega todos os valores da tabela1 onde c1 ='1' e os une a todas as linhas da tabela2. Se necessário, você só pode incluir valores table2 se c1 <> '1'.
select c1, c2, c3 from table1 where c1 = '1'
union all
select c1, c2, c3 from table2; -- where c1 <> '1' -- if necessary

ATUALIZAÇÃO

Com base nos dados de amostra e na saída esperada, use a segunda consulta acima:
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