Oracle
 sql >> Base de données >  >> RDS >> Oracle

ORA-00913 :trop de valeurs lors de l'utilisation du cas où

Lorsque vous utilisez un case , vous ne devez renvoyer qu'un seul enregistrement - pas plus de 1. Pour obtenir le résultat souhaité, j'utiliserais une jointure externe gauche (en supposant que vous avez un moyen de joindre table1 à table2), mais ajoutez votre contrôle sur table1.c1 dans le condition de jointure pour que les valeurs de table2 ne soient présentes que si 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';

Cette solution suppose que table1 et table2 sont liées. Si vous ne pouvez pas les relier, il semble presque que vous pouvez utiliser une union all dans laquelle vous prenez toutes les valeurs de table1 où c1 ='1' et les unissez à toutes les lignes de table2. Si nécessaire, vous ne pouvez inclure les valeurs table2 que si c1 <> '1'.

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

MISE À JOUR

En fonction de vos exemples de données et du résultat attendu, veuillez utiliser la deuxième requête ci-dessus :

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