SQL连接表和合并不同类型的列

时间:2017-09-28 11:31:23

标签: sql sql-server

这可能不常见,可能不是好事,但我想知道是否有可能。所以,让我们说我有两张看起来像这样的表:

T1: A--B--C--D     T2:  A--B--E--F
    1 |2 |3 |4         '1'|'1'|1|1
    2 |2 |1 |4         '2'|'2'|2|2

是否有办法加入这两个表,并在结果表中合并列AB以及列C, D, E, F。重点是T1中的列A和B属于Integer类型,T2属于varchar,这就是为什么我希望结果表中的这些列成为varchar也是。{ 结果表应如下所示:

T3: A--B--C--D--E--F     
   '1'|'2'|3 |4 |? |?        
   '2'|'2'|1 |4 |? |?
   '1'|'1'|? |? |1 |1
   '2'|'2'|? |? |2 |2

3 个答案:

答案 0 :(得分:2)

您可以使用full join

select coalesce(cast(t1.a as varchar(255)), t2.a) as a, 
       coalesce(cast(t1.b as varchar(255)), t2.b) as b,
       t1.c, t1.d, t2.e, t2.f
from t1 full join
     t2
     on t1.a = t2.a and t1.b = t2.b;

请注意,混合数据类型会使连接速度变慢。此外,如果值实际上不兼容(例如,如果字符串列不包含数字),则可能会出现类型转换错误。

编辑:

我实际上并不喜欢隐式转换,因此您可以明确地执行转换:

select coalesce(cast(t1.a as varchar(255)), t2.a) as a, 
       coalesce(cast(t1.b as varchar(255)), t2.b) as b,
       t1.c, t1.d, t2.e, t2.f
from t1 full join
     t2
     on cast(t1.a as varchar(255)) = t2.a and cast(t1.b as varchar(255)) = t2.b;

答案 1 :(得分:2)

使用convert()更改数据类型,并使用quotename()将整数用单引号括起来,例如varchar中的full outer join数据类型:

select 
    a = coalesce(t2.a,quotename(convert(varchar(5),t1.a),''''))
  , b = coalesce(t2.b,quotename(convert(varchar(5),t1.b),''''))
  , t1.c
  , t1.d
  , t2.e
  , t2.f
from t1
  full outer join t2
    on convert(varchar(5),t1.a) = t2.a
   and convert(varchar(5),t1.b) = t2.b

rextester演示:http://rextester.com/HSDSS14733

返回:

+-----+-----+------+------+------+------+
|  a  |  b  |  c   |  d   |  e   |  f   |
+-----+-----+------+------+------+------+
| '1' | '2' | 3    | 4    | NULL | NULL |
| '2' | '2' | 1    | 4    | NULL | NULL |
| '1' | '1' | NULL | NULL | 1    | 1    |
| '2' | '2' | NULL | NULL | 2    | 2    |
+-----+-----+------+------+------+------+

答案 2 :(得分:1)

另一种方法是使用UNION ALL。也许你会得到一些表现。

如果有任何类型转换错误,请更正。

select cast(a as varchar)a,cast(b as varchar)b,cast(c as varchar)c
,cast(d as varchar)d,null e,null f 
from T1
union ALL
select a,b,null c,null d, e,f 
from T2