使用SQL Server 2008,如何连接具有相同列名但具有不同数据类型的两个表

时间:2013-07-24 16:51:11

标签: sql join types alter

我有两个表,一个是名为tree2009的表,另一个是tree2012

Tree2009共有3657行,并且包含以下列:

  classid(bigint, not null)
  dbh(decimal(3,0),null)
  zone(nvarchar(3), null)
  inspect(nvarchar(10),null). 

Tree2012是一个更新的表,3839行,并且有列:

  classid(bigint, not null) 
  dbh (decimal(15,6), null)
  zone(nvarchar(254), null)
  inspect(datetime,null). 

tree2012的格式是首选格式,因此我想将dbhzoneinspect的数据类型和结构转换为2009格式,然后 COMBINE 基于公共列的表格classid

考虑到行的不同,这可能吗?对不起,如果我没有正确解释,因为我是新手。

1 个答案:

答案 0 :(得分:2)

当你说组合时,我假设你想要一个UNION,你可以创建一个包含两组的新表:

SELECT classid
     , dbh
     , zone
     , inspect
INTO Trees
FROM Tree2012
UNION 
SELECT classid
     , CAST(dbh AS DECIMAL(15,6))
     , CAST(zone AS NVARCHAR(254))
     , CAST(inspect AS DATETIME)
FROM Tree2009

UNION ALL应该是UNION,如果您只想将两个集合(忽略重复项)组合起来,由于防火墙问题而无法以这种方式发布,INSERT将检查和删除两组之间的重复行,因此较慢。

如果您只想保留Tree2012,也可以使用INSERT INTO Tree2012 SELECT classid , CAST(dbh AS DECIMAL(15,6)) , CAST(zone AS NVARCHAR(254)) , CAST(inspect AS DATETIME) FROM Tree2009

CAST()

您不需要JOIN每种数据类型,即示例中的区域从较短的nvarchar到较长的nvarchar。

如果您有重叠的classID,并且每个表中相同classID的值不同,那么您可能希望SELECT COALESCE(a.Classid,b.Classid)'ClassID' , a.dbh 'dbh-2012' , a.zone 'zone-2012' , a.inspect 'inspect-2012' , b.dbh 'dbh-2009' , b.zone 'zone-2009' , b.inspect 'inspect-2009' INTO NewTable FROM Tree2012 a FULL JOIN Tree2009 b ON a.Classid = b.Classid 并且每年有多列:

{{1}}