查看: 4057|回复: 6

[原创] 9i下含有connect by会导致以关联字段为条件做查询时,结果不正确的现象

[复制链接]
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
跳转到指定楼层
1#
发表于 2005-12-23 16:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
9i下含有connect by会导致以关联字段为条件做查询时,结果不正确的现象

测试环境
Windows 2000 Server SP4 , Oracle 9.2.0.1

现有两表TA(数据表)、TCODE(代码表)如下:
CREATE TABLE TA
(
  N_ID      NUMBER(10)                          NOT NULL,
  C_NAME    VARCHAR2(50 BYTE),
  N_SUP_ID  NUMBER(10),
  C_COLOR   VARCHAR2(10 BYTE),
  N_YXX     NUMBER(1)                           DEFAULT 1                     NOT NULL
);
ALTER TABLE TA ADD (
  PRIMARY KEY
(N_ID));
COMMENT ON COLUMN TA.N_SUP_ID IS '父记录的ID编号';

CREATE TABLE TCODE
(
  C_DM  VARCHAR2(10 BYTE),
  C_MC  VARCHAR2(50 BYTE)
);
ALTER TABLE TCODE ADD (
  PRIMARY KEY
(C_DM));

测试数据如下:
INSERT INTO TA ( N_ID, C_NAME, N_SUP_ID, C_COLOR, N_YXX ) VALUES (
1, 'a', NULL, 'A', 0);
INSERT INTO TA ( N_ID, C_NAME, N_SUP_ID, C_COLOR, N_YXX ) VALUES (
2, 'b', NULL, 'B', 1);
INSERT INTO TA ( N_ID, C_NAME, N_SUP_ID, C_COLOR, N_YXX ) VALUES (
3, 'c', NULL, 'C', 1);
INSERT INTO TA ( N_ID, C_NAME, N_SUP_ID, C_COLOR, N_YXX ) VALUES (
4, 'ab', 1, 'D', 0);
INSERT INTO TA ( N_ID, C_NAME, N_SUP_ID, C_COLOR, N_YXX ) VALUES (
5, 'ca', 3, 'D', 1);
INSERT INTO TA ( N_ID, C_NAME, N_SUP_ID, C_COLOR, N_YXX ) VALUES (
6, 'abc', 4, 'A', 0);
INSERT INTO TA ( N_ID, C_NAME, N_SUP_ID, C_COLOR, N_YXX ) VALUES (
7, 'abd', 4, 'A', 1);
INSERT INTO TA ( N_ID, C_NAME, N_SUP_ID, C_COLOR, N_YXX ) VALUES (
8, 'ac', 1, 'C', 0);
COMMIT;

INSERT INTO TCODE ( C_DM, C_MC ) VALUES (
'A', '黑色');
INSERT INTO TCODE ( C_DM, C_MC ) VALUES (
'B', '红色');
INSERT INTO TCODE ( C_DM, C_MC ) VALUES (
'C', '蓝色');
INSERT INTO TCODE ( C_DM, C_MC ) VALUES (
'E', '灰色');
COMMIT;

模拟问题出现的SQL语句
/*816不支持这种写法,9201下这种写法,在以C_COLOR为条件做查询时会导致记录数不正确
*/
create view tatest as
select A.N_ID, A.C_NAME, A.N_SUP_ID, A.C_Color, nvl(b.c_mc, a.c_color)
c_color_mc, prior a.c_name c_sup_name,  prior a.C_color c_sup_color
from ta A, tcode B
where a.c_color=b.c_dm
start with a.n_sup_id is null
connect by prior n_id=n_sup_id;
(是否做成视图都会出现下面的bug)
先看看里面的数据
[php]
SQL> select * from tatest;

      N_ID C_NAME       N_SUP_ID     C_COLOR    C_COLOR_MC  C_SUP_NAME  C_SUP_COLO
----------  ---------- ----------   ----------  --------    --------    --------
         1 a                         A          黑色
         8 ac               1        C          蓝色              a       A
         2 b                         B          红色
         3 c                         C          蓝色
。。。。。。。。。。。
[/php]
总共才4条
然而分别执行下面的语句
select * from tatest where c_color='A';--得到33条记录
select * from tatest where c_color='B';--得到1条记录
select * from tatest where c_color='C';--得到5条记录
贴出最后一条sql的执行结果
[php]
SQL> select * from tatest where c_color='C';

      N_ID C_NAME       N_SUP_ID C_COLOR    C_COLOR_MC    C_SUP_NAME   C_SUP_COLO
---------- ----------- ---------- ---------- ------------ ----------- ----------
         8 ac                   1 C          蓝色          a           A
         8 ac                   1 C          蓝色          a           A
         8 ac                   1 C          蓝色          a           A
         8 ac                   1 C          蓝色          a           A
         3 c                      C          蓝色

.....................
[/php]

发现有不少重复记录
而若以其他非两表的关联字段作为查询条件,则此现象不会出现

不知道其他版本下是否还有类似情况,有兴趣的做个试验?:)
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
2#
 楼主| 发表于 2005-12-23 16:12 | 只看该作者

使用道具 举报

回复
论坛徽章:
90
生肖徽章:蛇
日期:2006-09-07 17:09:082011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-02-18 11:43:34现任管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-01-04 11:50:442012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:09
3#
发表于 2005-12-23 16:43 | 只看该作者
我这里正常, oracle 10.2.0.1.0
SQL> select N_ID,C_NAME,C_COLOR_MC from tatest where c_color='A';

N_ID C_NAME   C_COLOR_MC
----- -------- ----------
    1 a        黑色

已选择 1 行。

SQL> select N_ID,C_NAME,C_COLOR_MC from tatest where c_color='B';

N_ID C_NAME   C_COLOR_MC
----- -------- ----------
    2 b        红色

已选择 1 行。

SQL> select N_ID,C_NAME,C_COLOR_MC from tatest where c_color='C';

N_ID C_NAME   C_COLOR_MC
----- -------- ----------
    8 ac       蓝色
  3 c         蓝色

已选择2行。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
4#
 楼主| 发表于 2005-12-23 17:52 | 只看该作者
谢谢jackywood支持:)
貌似10里面修正了许多9i下的connect by的bug

使用道具 举报

回复
论坛徽章:
7
ITPUB元老
日期:2005-04-22 09:33:06授权会员
日期:2005-10-30 17:05:33铁扇公主
日期:2006-04-13 11:04:44紫蜘蛛
日期:2006-04-13 11:05:58会员2006贡献徽章
日期:2006-04-17 13:46:34BLOG每日发帖之星
日期:2009-05-24 01:01:022010新春纪念徽章
日期:2010-03-01 11:08:29
5#
发表于 2005-12-29 11:50 | 只看该作者
我在以下环境测都是正确的:
Oracle 9.2.0.1 for windows
Oracle 9.2.0.4 for linux
Oracle 9.2.0.6 for linux

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
6#
 楼主| 发表于 2005-12-29 13:36 | 只看该作者
最初由 yaanzy 发布
[B]我在以下环境测都是正确的:
Oracle 9.2.0.1 for windows
Oracle 9.2.0.4 for linux
Oracle 9.2.0.6 for linux [/B]


第一个
Oracle 9.2.0.1 for windows
不会吧
我的测试环境也是这样的啊。。。

客户端用8i/9i的都出现同样的问题

使用道具 举报

回复
论坛徽章:
8
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34会员2007贡献徽章
日期:2007-09-26 18:42:102011新春纪念徽章
日期:2011-02-18 11:42:49ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32兰博基尼
日期:2014-01-31 14:56:26优秀写手
日期:2015-01-08 06:00:14优秀写手
日期:2015-02-12 06:00:15
7#
发表于 2005-12-29 14:01 | 只看该作者
Oracle 9.2.0.4 for linux
没有问题

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表