Kiedy używasz case
, musisz zwrócić tylko jeden rekord - nie więcej niż 1. Aby osiągnąć pożądany wynik, użyłbym lewego sprzężenia zewnętrznego (zakładając, że masz sposób na połączenie table1 z table2), ale dodaj czek na table1.c1 do warunek sprzężenia, aby wartości z tabeli2 były obecne tylko wtedy, gdy 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';
To rozwiązanie zakłada, że tabela1 i tabela2 są powiązane. Jeśli nie możesz ich powiązać, brzmi to tak, jakbyś mógł użyć unii all, w której bierzesz wszystkie wartości z tabeli 1, gdzie c1 ='1' i łączysz je ze wszystkimi wierszami tabeli2. Jeśli to konieczne, możesz dołączyć tylko wartości tabeli 2, jeśli c1 <> '1'.
select c1, c2, c3 from table1 where c1 = '1'
union all
select c1, c2, c3 from table2; -- where c1 <> '1' -- if necessary
AKTUALIZUJ
Na podstawie przykładowych danych i oczekiwanych wyników użyj drugiego zapytania powyżej:
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