0

我有两个表,一个是名为的表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是首选,所以我想将 , 的数据类型和结构转换为2009格式,然后dbh根据公共列组合表格 .zoneinspectclassid

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

4

1 回答 1

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()每种数据类型,即示例中的区域从较短的 nvarchar 变为较长的 nvarchar。

如果您有重叠的 classID,并且每个表中相同 classID 的值不同,那么您可能希望JOIN每年有多个列:

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
于 2013-07-24T16:59:17.107 回答