读书人

left join基础解决思路

发布时间: 2013-12-29 13:07:03 作者: rapoo

left join基础
表一
name data_
A 4
b 6
A 2
B 3
C 4
D 5

表二
name data_
A 3
b 5
B 2
D 1

现在要求得到
name data_ data_2
A 4 3
b 6 5
A 2 3
B 3 2
C 4
D 5 1
D 5
[解决办法]


select a.name,a.data_,b.data_ as data_2
from 表一 a
left join 表二 b on a.name=b.name

[解决办法]

create table 表一(name varchar(10),data_ int)

insert into 表一
select 'A',4 union all
select 'b',6 union all
select 'A',2 union all
select 'B',3 union all
select 'C',4 union all
select 'D',5

create table 表二(name varchar(10),data_ int)

insert into 表二
select 'A',3 union all
select 'b',5 union all
select 'B',2 union all
select 'D',1


select a.name,a.data_,b.data_ 'data_2'
from 表一 a
left join 表二 b on a.name=b.name collate Chinese_PRC_CS_AS

/*
name data_ data_2
---------- ----------- -----------
A 4 3
b 6 5
A 2 3
B 3 2
C 4 NULL
D 5 1

(6 row(s) affected)
*/

[解决办法]

if object_id ('T1') is not null
drop table T1
create table T1(name varchar(20),data_ int)
insert into T1
select 'A',4 union all
select 'b',6 union all
select 'A',2 union all
select 'B',3 union all
select 'C',4 union all
select 'D',5
if object_id ('T2') is not null
drop table T2
create table T2(name varchar(20),data_ int)

insert into T2
select 'A',3 union all
select 'b',5 union all
select 'B',2 union all
select 'D',1


select a.name,a.data_,b.data_ 'data_2'
from T1 a
left join T2 b on a.name=b.name

[解决办法]

select a.name,a.data_,b.data_ as data_2
from 表一 a
left join 表二 b on a.name=b.name

[解决办法]
引用:
我现在按照一般的写法还是不行
我发现我的表一 里面的数据,name这行里面所有值都有一个空格,
name data_
A 4
b 6
A 2
B 3


C 4
D 5



改了上面的代码,去掉了空格,应该就可以了:
create table 表一(name varchar(10),data_ int)

insert into 表一
select ' A ',4 union all
select ' b ',6 union all
select ' A ',2 union all
select ' B ',3 union all
select ' C ',4 union all
select ' D ',5

create table 表二(name varchar(10),data_ int)

insert into 表二
select 'A',3 union all
select 'b',5 union all
select 'B',2 union all
select 'D',1


select a.name,a.data_,b.data_ 'data_2'
from 表一 a
left join 表二 b on rtrim(ltrim(a.name))=b.name collate Chinese_PRC_CS_AS

/*
namedata_data_2
A 43
b 65
A 23
B 32
C 4NULL
D 51
*/

[解决办法]
引用:
表一和表二 name 里面的值 有的是中文啊 就是名字 就不准了


能不能把没有匹配上的,列出1个名字,然后,分析一下,才能知道为什么,上面的语句,不能满足你的要求
[解决办法]
select a.name,a.data_,b.data_ as data_2
from 表一 a
left join 表二 b on ltrim(rtrim(a.name))=ltrim(rtrim(b.name))
[解决办法]
来点实际数据吧,敏感数据可以稍微修改一下,但是类型还是要一直
[解决办法]
引用:
我现在按照一般的写法还是不行
我发现我的表一 里面的数据,name这行里面所有值都有一个空格,
name data_
A 4
b 6
A 2
B 3
C 4
D 5
噗~用trim去掉空格吧,你是怎么发现是空格而不是其它的特殊符号
[解决办法]

select A.name,A.data as data_1,B.data as _date_2 from A left join B on A.name=B.name COLLATE Chinese_PRC_CS_AS


[解决办法]

select A.name,A.data as data_1,B.data as _date_2 from A left join B
on ltrim(rtrim(A.name))=ltrim(rtrim(B.name)) COLLATE Chinese_PRC_CS_AS

[解决办法]
似乎知道了点啥:那个不是空格吧,是貌似空格的 特殊字符吧。Excel文件里经常有这种字符,导入数据库不注意都会这样。所以左右trim不管用吧?
只能 replace(A.name,' ','')-- 注意' '这个里面不是空格,是你从数据库里粘过来的特殊字符

读书人网 >SQL Server

热点推荐