首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

left join基础解决思路

2013-12-29 
left join基础表一 name data_A4b6A2B3C4D5表二namedata_A3b5B2D1现在要求得到name data_data_2A43b65A23B

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,' ','')-- 注意' '这个里面不是空格,是你从数据库里粘过来的特殊字符

热点排行