När du använder ett case
, du måste bara returnera en enskild post - inte mer än 1. För att uppnå önskat resultat skulle jag använda en vänster yttre koppling (förutsatt att du har ett sätt att ansluta tabell1 till tabell2), men lägg till din check på tabell1.c1 i join-villkor så att tabell2-värden endast skulle finnas om 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';
Denna lösning förutsätter att tabell1 och tabell2 hänför sig. Om du inte kan relatera dem, så låter det nästan som att du kan använda en union all i där du tar alla värden från tabell1 där c1 ='1' och förenar dem till alla tabell2-rader. Om det behövs kan du bara inkludera tabell2-värden om c1 <> '1'.
select c1, c2, c3 from table1 where c1 = '1'
union all
select c1, c2, c3 from table2; -- where c1 <> '1' -- if necessary
UPPDATERA
Baserat på dina exempeldata och förväntade utdata, använd den andra frågan ovan:
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