【问题标题】:Using SQL Server 2008, how to join two tables with same column names, but different datatypes使用 SQL Server 2008,如何连接两个具有相同列名但数据类型不同的表
【发布时间】:2013-07-24 07:06:16
【问题描述】:

我有两个表,一个是名为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

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

【问题讨论】:

  • 你所说的组合是什么意思? MERGETree2009 中的行变成Tree2012?用UNIQUE VALUES获得第三张桌子?
  • 我想要第三个表,它根据 CLASSID 合并所有记录。同时,我希望将额外的记录(因为 2012 表有更多记录)包含在此表中。这有帮助吗?

标签: sql join types alter


【解决方案1】:

当你说组合时,我假设你想要一个 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 将检查并删除两者之间的重复行设置,因此速度较慢。

如果您只想保留 Tree2012,也可以使用 INSERT

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

【讨论】:

  • 对不起,我应该说我想要第三个新表来输出记录。我猜应该使用 CLASSID 来加入表吗?我不确定 JOIN 或 UNION 是否是“组合”表的更好选择(我不知道除了“组合”之外还能使用什么词)。
  • 查看更新的答案,添加了INTO 部分。如果您打算将 Classid 用于JOIN 表格,您的新表格会是什么样子?
  • 好吧,classID 将是共享唯一值的列,对吧?因此,应根据此列连接表。
  • 2012 表有更多行,因此这些额外的行将添加到 2009 行之上。因此,新的第三个表理论上应该有 3839 行。
  • 那么,当两个表中都有一个 classID 时,对于那个 classId,每个字段都有 2 个?或者当 classID 相同时,两个表中的值是否相同?
猜你喜欢
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
相关资源
最近更新 更多