2017-04-10 63 views
0

有没有办法在T-SQL中隐式地组合一个或多个表?我来自SAS背景,如果想要堆叠多个具有不同列数和名称的表,SAS足够聪明地知道col x不在表y中,因此它将清空所有这些值。T-Sql隐式组合多个表中的一个?

例如,从SAS文件(见实施例1):

data concatenation; 
    set animal plant; 
run; 

随着T-SQL所有我有: SAS Example

OBS Common Animal Number  OBS Common Plant  Number 

1  a  Ant  5   1  g  Grape  69 
2  b  Bird     2  h  Hazelnut 55 
3  c  Cat  17   3  i  Indigo  . 
4  d  Dog  9   4  j  Jicama  14 
5  e  Eagle     5  k  Kale   5 
6  f  Frog  76   6  l  Lentil  77 

为这两个表是作为简单结合能够发现到目前为止将这两个组合在一起,是明确列出并清空select语句中的所有值。

像这样,例如(一):

select obs, common, animal, null as plant, number 
from animal 
union all 
select obs, common, null as animan, plant, number 

现在,如果植物和动物的表有相同的列名会很容易为例(B):

select * from plants 
union all 
select * from animals 

现在,我的问题是,是否有办法将不匹配的表与T-SQL相结合,就像SAS示例一样容易,或者我将不得不明确定义示例(a)中的任何不匹配。

+0

这是没有那么多的列名 - 但UNION你必须有相同的列数和列必须是相同的数据类型作为第一选择相应的列。 – scsimon

+1

很确定你在例子a中有你的答案,我不认为在sql中有一个等价物。 – Simon

回答

0

在sql server中没有等价物,所以你必须使用例子(a)。

您需要确保所有字段具有相同的数据类型。
尝试使用convert(或cast)函数来使您的示例(a)正常工作。
我不知道你的数据类型,所以你只是猜测,你可以用正确的数据类型来调整这个例子。

select convert(int, obs), 
     convert(nvarchar, common), 
     convert(nvarchar, animal), 
     convert(nvarchar, null) as plant, 
     convert(decimal(16,2), number) 
from animal 
union all 
select convert(int, obs), 
     convert(nvarchar, common), 
     convert(nvarchar, null) as animal, 
     convert(nvarchar, plant), 
     convert(decimal(16,2), number) 
from plant 
0

我的印象是否定的。

如果您确实有一个现有的表具有所有可能的列,那么您可以使用INSERT从表中添加包含该列子集的记录。

insert into concatenation (Common,Animal,Number) 
    select Common,Animal,Number from animals 
; 
insert into concatenation (Common,Plant,Number) 
    select Common,Plant,Number from plants 
;