这可能不常见,可能不是好事,但我想知道是否有可能。所以,让我们说我有两张看起来像这样的表:
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
是否有办法加入这两个表,并在结果表中合并列A
和B
以及列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
答案 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