日期:2014-05-17  浏览次数:20552 次

两表只有一个字段不相同,部分(前3个)字段的值完全相等,进行表连接形成新表。
本帖最后由 bbaizz 于 2013-05-24 11:14:02 编辑
1、前提:部分A1 A2 A3字段的值完全相等。
2、表结构
表1结构:
A1 A2 A3 A4
22 33 44 55

表2结构:
A1 A2 A3 B4
66 77 88 99
22 33 44 88

3、执行过程
通过
select A1, A2, A3, A4,'' as B4 from t1
union
select A1, A2, A3, '',B4 from t2
出来的结果显示:
A1 A2 A3 A4 B4
22 33 44 55 NULL
22 33 44 NULL 88
66 77 88 NULL 99
请问这是什么原因呢,理论上相同值会去重的。

4、实际期望
实际期望值:连接出来的新表

A1 A2 A3 A4 B4
22 33 44 55 88
66 77 88 NULL 99

------解决方案--------------------

declare  @test1 table (A1 varchar(10),a2 VARCHAR(10),A3 VARCHAR(10),A4 VARCHAR(10))

declare  @test2 table (A1 varchar(10),a2 VARCHAR(10),A3 VARCHAR(10),B4 VARCHAR(10))
INSERT INTO @test1 VALUES ('22 ','33','44','55')
INSERT INTO @test2 VALUES ('22 ','33','44','88')
INSERT INTO @test2 VALUES ('21 ','34','45','99')

SELECT ISNULL(T1.A1,T2.A1) AS A1,ISNULL(T1.A1,T2.a2) AS A2,
ISNULL(T1.A3,T2.A3) AS A3,A4,B4 
 FROM @test1 T1 FULL OUTER JOIN @test2 T2 ON T1.A1 = T2.A1 AND T1.a2 = T2.a2 AND T1.A3 = T2.A3
 
------解决方案--------------------

with t1(a,b,c,d)as(
select 22,33,44,55
)
,tc (a,b,c,d) as(
select 66,77,88,99 union all
select 22,33,44,88
)
select b.a,b.b,b.c,coalesce(b.d,a.d),coalesce(a.e,b.e) 
from (select a,b,c,d,null e from t1)a full join (select a,b,c,null d,d e from tc)b
on a.a=b.a and a.b=b.b and a.c=b.c

------解决方案--------------------

--X
select B.A1,B.A2,B.A3,(CASE WHEN A.A4 IS NULL THEN B.A4 ELSE A.A4 END)A4,
 (CASE WHEN A.B4 IS NULL THEN B.B4 ELSE A.B4 END)B4 from 
(
select A1, A2, A3, A4,'' as B4 from a
)a
full join
(
select A1, A2, A3, ''as A4,B4 from b 
)b ON a.a1=b.a1 and a.A2=b.A2 and a.A3=b.A3