T-Sql隐含地组合了一个或多个表?

时间:2017-04-10 12:57:38

标签: sql-server tsql sas

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

例如,从SAS文档(参见示例1): 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

将这两个表组合起来很简单:

data concatenation;
   set animal plant;
run;

使用T-SQL我到目前为止能够找到组合这两个集合的所有内容,就是明确地列出并删除select语句中的所有值。

像这样,例子(a):

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)。

2 个答案:

答案 0 :(得分:0)

SQL Server中没有等效项,因此您必须使用示例(a)。

您需要确保所有字段都具有相同的数据类型。尝试使用convert(或强制转换)函数使您的示例(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

答案 1 :(得分: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
 ;