Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3583449
  • 博文数量: 109
  • 博客积分: 10011
  • 博客等级: 上将
  • 技术积分: 2457
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-18 19:04
文章分类

全部博文(109)

文章存档

2011年(1)

2010年(10)

2009年(36)

2008年(62)

我的朋友

分类: Oracle

2009-08-05 22:01:55

亚信一道数据仓库的一个很普通的面试题,我发现了一个问题,谁能帮我解释一下。
题目是这样的:
年龄维:
id subl_id age_min age_max age_desc   sub_desc
1     1       1      10      1-15       1-10
1     2       11     15      1-15       11-15
2     3       16     25      16-30      16-25
2     4       26     30      16-30      26-30
3     5       30     45      30-45      30-45
事实表:
cust_id sex age deposit
1 1 7 300
2 2 20 30
3 1 16 300
4 1 39 20
 
场景1:
查询性别为1,年龄小于50,按照age_desc分组计算的客户数。
 
方法1:(这时候AGE字段是NUMBER类型的)
sql语句如下:
SELECT dim.AGE_DESC,COUNT(f.CUST_ID),SUM(deposit)
FROM AGE_DIM DIM,
           AFACT F
WHERE F.SEX=1
AND F.AGE<50
AND F.AGE >=DIM.AGE_MIN
AND F.AGE <=DIM.AGE_MAX
GROUP BY DIM.AGE_DESC
 
得到的结果如下
1 16-30 1 300
2 1-15 1 300
3 30-45 1 20
 
场景2:(这时候我把AGE字段由原来的NUMBER改成VARCHAR2(100)类型)
运行上面的SQL语句,得到的结果确实这样的。
1 16-30 1 300
2 30-45 1 20
 
发现没有统计出这“1 1 7 300”一条数据,应该要出来的,我把7改成1到9之间的数字不能出来,换成10到15之间的数据能出来
这确实是我遇到的一个奇怪的问题。
 
有兴趣的朋友测试试验一下。难道是ORACLE的一个BUG?请哪位大虾指导一下。。。
 

 
阅读(1848) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

liugao_06142009-08-06 11:39:05

回答自己提的问题 如果age是varchar2的话,varchar2类型的比较是字符的比较,先比较第一个字符,'7'比'5'大(其实ORACLE是比较的ASCII码),如果第一个字符一样,就比较第二个字符。所以得到的结果是‘7’比‘50’大。这一点和JAVA不一样,JAVA只能比较单字符,比如‘7’>‘5’.如果比较‘7’>'50'的话,编译无法通过。