碰到一个怪问题

zjsyw 2008-10-07 09:04:49
有三个表,一个是商品表A,我简化一下,两个字段:SP_ID(商品编号),SP_LX(商品类型) 该字段可以为空;另一个是销售表B,也简化一下,三个字段:SP_ID(商品编号),XS_SL(销售数量),XS_SJ(销售时间);最后一个表是类型表C,两个字段:SP_LX(商品类型),SP_MC(商品名称).

我先用一个SQL统计某段时间内的各类商品的销售:select C.SP_MC,sum(B.XS_SL) from A,B,C where A.SP_ID=B.SP_ID and A.SP_LX*=C.SP_LX and B.XS_SJ>='20081001' and B.XS_SJ<'20081007' group by C.SP_MC

得到的结果如下:
NULL 200
电池 10
饮料 30
.........

因为商品表里的商品类型可以为空,所以有NULL这个统计结果

现在我用一个SQL想查该段时间内都有那些销售的商品的商品类型是空的
select A.* from A,B where A.SP_ID=B.SP_ID and B.XS_SJ>='20081001' and B.XS_SJ<'20081007' and A.SP_LX is NULL
结果查出的记录为0

select A.* from A,B where A.SP_ID=B.SP_ID and B.XS_SJ>='20081001' and B.XS_SJ<'20081007' and A.SP_LX=NULL
结果也为0
我想破脑袋也没想出原因:(,大家帮我看看
...全文
98 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjsyw 2008-10-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 WWWWA 的回复:]
主要是判断DM是否为空,通用的就是IS NULL
select a.* from 商品表 a left join 销售表 b on a.id=b.id where a.dm IS NULL
[/Quote]

是的,我按各类别的商品销售查出来,分类为空的有销售数量,肯定有商品的分类为空,所以我用下面的SQL去查,想看看都哪些商品分类为空

select A.* from A,B where A.SP_ID=B.SP_ID and B.XS_SJ>='20081001' and B.XS_SJ <'20081007' and A.SP_LX is NULL
结果查出的记录为0

select A.* from A,B where A.SP_ID=B.SP_ID and B.XS_SJ>='20081001' and B.XS_SJ <'20081007' and A.SP_LX=NULL
结果也为0
WWWWA 2008-10-07
  • 打赏
  • 举报
回复
主要是判断DM是否为空,通用的就是IS NULL
select a.* from 商品表 a left join 销售表 b on a.id=b.id where a.dm IS NULL
wwwwb 2008-10-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zjsyw 的回复:]
老大,ISNULL应该还有个参数的吧,这个函数应该是把空的字段转换成其它字符用的
[/Quote]
呵呵,要根据你的数据库系统函数进行修改,在MYSQL、ACCESS、VFP中可以直接使用,
SQLSERVER中要加入另一个参数
OR
select a.* from 商品表 a left join 销售表 b on a.id=b.id where a.dm IS NULL
zjsyw 2008-10-07
  • 打赏
  • 举报
回复
老大,ISNULL应该还有个参数的吧,这个函数应该是把空的字段转换成其它字符用的
wwwwb 2008-10-07
  • 打赏
  • 举报
回复
没有用到分类表,查找这种记录一般用左右连接,不能用内连接
wwwwb 2008-10-07
  • 打赏
  • 举报
回复
简单一点,假设两表以ID为连接,02011001 字段为DM
select a.* from 商品表 a left join 销售表 b on a.id=b.id where isnull(a.dm)
zjsyw 2008-10-07
  • 打赏
  • 举报
回复
谢谢老大了,万分感谢
zjsyw 2008-10-07
  • 打赏
  • 举报
回复
商品表:
7560055486 001, 02011001
7560522742 001, 02020101
7562010803 002, 01020401
7798960761 001,
7798960785 001,
7800312887 001, 03040201
7801287371 001, 03010101
7801384342 001, 03010101
7801601335 004, 03010101
7801601491 003, 03010101
7801602072 004, 03010101

销售表:
20080109 ,7560055486 001, 5
20080109 ,7560522742 001, 3
20080109 ,7562010803 002, 165
20080109 ,7798960761 001, 4
20080109 ,7798960785 001, 4
20080109 ,7800312887 001, 10
20080109 ,7801287371 001, 2
20080109 ,7801384342 001, 5
20080109 ,7801601335 004, 5
20080109 ,7801601491 003, 5
20080109 ,7801602072 004, 5

分类表:
酒类 , 02011001
电池 , 02020101
饮料 , 01020401
衣服 , 03040201
食品 , 03010101
wwwwb 2008-10-07
  • 打赏
  • 举报
回复
用TXT格式,A、B两表字段名及记录内容,10条有代表性的记录就OK
zjsyw 2008-10-07
  • 打赏
  • 举报
回复
怎么贴数据呢?
wwwwb 2008-10-07
  • 打赏
  • 举报
回复
贴数据吧,以供测试
zjsyw 2008-10-07
  • 打赏
  • 举报
回复
老大,不行,一样的.

select A.* from A right join B on A.SP_ID=B.SP_ID and B.XS_SJ>='20081001' and B.XS_SJ <'20081007' and where A.SP_LX is NULL
or
select A.* from b left join a on A.SP_ID=B.SP_ID and B.XS_SJ>='20081001' and B.XS_SJ <'20081007' and where A.SP_LX is NULL

应该是

select A.* from A right join B on A.SP_ID=B.SP_ID where B.XS_SJ>='20081001' and B.XS_SJ <'20081007' and A.SP_LX is NULL
or
select A.* from b left join a on A.SP_ID=B.SP_ID where B.XS_SJ>='20081001' and B.XS_SJ <'20081007' and A.SP_LX is NULL
这样吧

我用下面这个SQL来查,查出来的商品类型中就含了很多NULL,
select A.* from A,B where A.SP_ID=B.SP_ID and B.XS_SJ>='20081001' and B.XS_SJ<'20081007'

select A.* from A join B on A.SP_ID=B.SP_ID where B.XS_SJ>='20081001' and B.XS_SJ<'20081007'

结果就象如下:
白象电池 电池
某商品 NULL
可乐 饮料
........


可是
select A.* from A,B where A.SP_ID=B.SP_ID and B.XS_SJ>='20081001' and B.XS_SJ <'20081007' and A.SP_LX is NULL
就什么也查不出来了

我的疑问就是为什么我可以查出类型是NULL的商品,但是把类型为NULL作为条件加到SQL里去就什么查不出来了:(,感觉SYBASE常出些很奇怪的问题,我总是手足无措
wwwwb 2008-10-07
  • 打赏
  • 举报
回复
*=是右连接的话:
select A.* from A right join B on A.SP_ID=B.SP_ID and B.XS_SJ>='20081001' and B.XS_SJ <'20081007' and where A.SP_LX is NULL
or
select A.* from b left join a on A.SP_ID=B.SP_ID and B.XS_SJ>='20081001' and B.XS_SJ <'20081007' and where A.SP_LX is NULL

尽量用标准的SQL语句
WWWWA 2008-10-07
  • 打赏
  • 举报
回复
呵呵,就是觉得SQL语句没有什么问题嘛,自己解决更好
zjsyw 2008-10-07
  • 打赏
  • 举报
回复
对不起,两位老大,是我搞错了,商品表中是不少商品分类为空,但那几天销售的商品的分类没有为空的,那些分类是空格.
select A.* from A,B where A.SP_ID=B.SP_ID and B.XS_SJ>='20081001' and B.XS_SJ <'20081007' and RTRIM(A.SP_LX) is NULL

加了RTRIM函数就好了,
再次感谢
放几天结帖
WWWWA 2008-10-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zjsyw 的回复:]
其实直接
select * from A where SP_LX is NULL
是可以把所有分类为空商品都显示出来的,
我就是奇怪我想查那几天销售中有商品分类为空的商品,怎么就不行了
select A.* from A,B where A.SP_ID=B.SP_ID and B.XS_SJ>='20081001' and B.XS_SJ <'20081007' and A.SP_LX is NULL
[/Quote]

A.SP_LX是NULL还是空值?检查一下表的定义
zjsyw 2008-10-07
  • 打赏
  • 举报
回复

select A.* from A,B where A.SP_ID=B.SP_ID and B.XS_SJ>='20081001' and B.XS_SJ <'20081007'
可以把那几天销售的商品都列出来,包括分类为空的
但加了'and A.SP_LX is NULL' 就查出0条记录
可见这句话有问题,但是怎么看也看不出问题在哪里
zjsyw 2008-10-07
  • 打赏
  • 举报
回复
其实直接
select * from A where SP_LX is NULL
是可以把所有分类为空商品都显示出来的,
我就是奇怪我想查那几天销售中有商品分类为空的商品,怎么就不行了
select A.* from A,B where A.SP_ID=B.SP_ID and B.XS_SJ>='20081001' and B.XS_SJ <'20081007' and A.SP_LX is NULL

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧