2013-07-18 3 views
0

у меня есть две временные таблицы, говорят #t1 и #t2 в Sql Server 2008. Мне нужно создать #t3, такие как:лучший способ для выбора данных из одной таблицы или другой

  • когда #t1 имеет строки, индифферентно из #t2 содержание «s, #t3 = select * from #t1
  • , когда #t1 не имеет ни одной строки, #t3 = select * from #t2

мы можем предположить, что #t1 и #t2 имеют одинаковые столбцы, но я не думаю, что я бы хотел положиться на этот факт.

Я думал о чем-то, что выводит какую-то логику из «if exists (select * ...)», но разве не было бы лучше, чем какие-то операторы bool?

+0

Как вы хотите рассматривать случай, когда t1 и t2 не имеют одинаковых столбцов? –

+1

@ Radu Gheorghiu Это не имеет значения, так как он использует '#temporary table'. – EmmanuelRC

ответ

2

Самый простой способ заключается в реализации логики, как:

if (exists (select * from #t1)) 
begin 
    select * 
    into #t3 
    from #t1; 
end; 
else 
begin 
    select * 
    into #t3 
    from #t2; 
end; 

Вы можете сделать это в одном операторе, как:

select t.* 
into #t3 
from ((select * 
     from #t1 
     ) 
     union all 
     (select * 
     from #t2 
     where not exists(select * from #t1) 
     ) 
    ) t 

Однако, я думаю, что явное if это ясный способ выразить ваше намерение.

+2

+1, но изменение 'exists (select * from # t1)' to 'exists (выберите 1 из # t1)' приведет к значительно лучшей производительности, так как '1' - это самый младший бит, который можно прочитать, есть нет необходимости выбирать все данные, чтобы проверить, существует ли что-либо. – EmmanuelRC

+0

@ EmmanuelRC Хорошее наблюдение, +1 –

+3

@EmmanuelRC оптимизатор достаточно умен, чтобы не учитывать список SELECT, поэтому ваш комментарий неправильный. См. Http://stackoverflow.com/a/4115354/904178 –

0

Этот запрос будет делать только, что бы увидеть, если есть строки в t1 и в этом случае заполнять таблицу t3 с содержанием t1, при условии, что они имеют те же столбцы, в противном случае он населяет t3 с содержанием t2.

IF(select count(*) from t1) > 0 
    BEGIN 
     select * into t3 from t1 
    END 
ELSE 
    BEGIN 
     select * into t3 from t2 
    END 

Вот SQLFiddle, так что вы можете увидеть, как это работает. Чтобы проверить случай, когда t1 не имеет строк, просто удалите строку, которая вставляет в t1, перестройте схему и заново запустите запрос.

Смежные вопросы