从一个表或另一个表中选择数据的最佳方法

时间:2013-07-18 15:59:27

标签: sql sql-server-2008

我有两个临时表,在Sql Server 2008中说#t1#t2。我需要创建#t3,例如:

  • #t1有行时,对#t2的内容漠不关心,#t3 = select * from #t1
  • #t1没有行时,#t3 = select * from #t2

我们可以假设#t1#t2具有相同的列,但我认为我不想依赖这一事实。

我在考虑从“if exists (select * ...)”语句中汲取一些逻辑,但不会像某种bool运算符那样更好吗?

2 个答案:

答案 0 :(得分: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是表达意图的更明确的方式。

答案 1 :(得分: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的行,重建模式并重新运行查询。