帮忙看看这个SQL语句有什么问题?急等

phoenix2xp 2004-08-11 11:11:50
两个表:door、history,其中door中有字段chpoliceid、chdoorid,history表中有字段czbm(操作表名,其值为对应表名,如:‘door’)、zdz(字段值,形式为|chpoliceid|chdoorid,其中chpoliceid和chdoorid分别是door表中对应记录的对应字段值)、czzt(操作状态,包括增加、删除)。
由于history表中还有其它表的操作记录,即history记录数>door记录数,所以我用了一个左联接:

SELECT d.chpoliceid, d.chdoorid,h.czzt FROM door d LEFT JOIN history h ON h.czbm='door' and h.zdz='|'+d.chpoliceid+'|'+d.chdoorid

但运行语句,每次得到的czzt字段值都为null(数据库中有值)。经过各种方法测试,应该是以下部分出错:
h.zdz='|'+d.chpoliceid+'|'+d.chdoorid
我也试过用like代替=,但还是一样的问题。

哪位老大帮我指点指点啊!谢谢!
...全文
131 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
phoenix2xp 2004-08-11
肯定是关联条件出错了,用full join联接后,结果显示是关联条件没有实现的样子。
回复
phoenix2xp 2004-08-11
还是不行。

另外,full join不行的吧,我要取的是door表中的数据,history表中记录数比door表多得多啊!
回复
啊呀 2004-08-11
right join ,full join 有什么结果呢?
回复
phoenix2xp 2004-08-11
都试了!还是不行啊……

再帮我看看吧!我都头痛死了!!!
回复
青团子 2004-08-11
如果还不对,检查你的数据库字段类型
chpoliceid,chdoorid如果是int型,则convert(varchar,chpoliceid)
如果czbm,zdz是char类型就trim一下
然后再试试看看
回复
frankwong 2004-08-11
--d.chpoliceid 和 d.chdoorid 字段值前后是否有空格,试一下
SELECT d.chpoliceid, d.chdoorid,h.czzt FROM door d LEFT JOIN history h ON h.zdz='|'+rtrim(ltrim(d.chpoliceid))+'|'+rtrim(ltrim(d.chdoorid))
where h.czbm='door'
回复
青团子 2004-08-11
SELECT d.chpoliceid, d.chdoorid,h.czzt FROM door d LEFT JOIN history h ON h.zdz='|'+d.chpoliceid+'|'+d.chdoorid
where h.czbm='door'
试试看
回复
phoenix2xp 2004-08-11
我明白了,应该是我的数据类型问题了!因为这个测试表都是我临时建的,chpoliceid和chdoorid的类型都是char(10),数据也是我临时编出来的,应该就是这个原因了!

多谢Cityfire(青团子)
:)

回复
青团子 2004-08-11
--建立测试表
create table door(chpoliceid int,chdoorid int)
insert into door select 1,2
union all select 2,7
union all select 4,2
union all select 3,9
union all select 5,12

create table history(czbm varchar(10),zdz varchar(10),czzt varchar(10))
insert into history select 'door','|1|2','add'
union all select 'door','|1|2','update'
union all select 'door','|2|7','add'
union all select 'door','|4|2','add'
union all select 'other','|4|2','add'
union all select 'other','|5|12','add'
union all select 'door','|3|9','add'
union all select 'door','|5|12','add'
union all select 'door','|7|6','add'
union all select 'door','|5|12','update'
union all select 'door','|7|6','delete'

--查询数据
SELECT d.chpoliceid, d.chdoorid,h.czzt FROM door d
LEFT JOIN history h ON h.czbm='door' and h.zdz='|'+convert(varchar(10),d.chpoliceid)+'|'+convert(varchar(10),d.chdoorid)

SELECT d.chpoliceid, d.chdoorid,h.czzt FROM door d
LEFT JOIN history h ON h.zdz='|'+convert(varchar(10),d.chpoliceid)+'|'+convert(varchar(10),d.chdoorid)
where h.czbm='door'

--删除测试表
drop table door
drop table history

--查询结果
chpoliceid chdoorid czzt
----------- ----------- ----------
1 2 add
1 2 update
2 7 add
4 2 add
3 9 add
5 12 add
5 12 update

(所影响的行数为 7 行)

chpoliceid chdoorid czzt
----------- ----------- ----------
1 2 add
1 2 update
2 7 add
4 2 add
3 9 add
5 12 add
5 12 update

(所影响的行数为 7 行)

回复
青团子 2004-08-11
把你的表结构和一些示例数据贴出来看看
回复
phoenix2xp 2004-08-11
各位再帮我一起看看啊!
回复
发帖
应用实例
创建于2007-09-28

2.7w+

社区成员

MS-SQL Server 应用实例
申请成为版主
帖子事件
创建了帖子
2004-08-11 11:11
社区公告
暂无公告