查看: 3916|回复: 3

[SQL] 急救!一个带条件的层次查询

[复制链接]
论坛徽章:
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-8-2 16:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
数据库结构
1、TA
CREATE TABLE TA
(
  N_ID      NUMBER(10)                          NOT NULL,
  C_NAME    VARCHAR2(50 BYTE),
  N_SUP_ID  NUMBER(10),
  C_COLOR   VARCHAR2(10 BYTE)
)
/
ALTER TABLE TA ADD (
  PRIMARY KEY
(N_ID))
/
2、TCODE
CREATE TABLE TCODE
(
  C_DM    VARCHAR2(10),
  C_MC VARCHAR2(50)
)
/
ALTER TABLE TCODE ADD (
  PRIMARY KEY
(C_DM))
/
3、TACODE
create view TACODE as
SELECT
N_ID, C_NAME, N_SUP_ID, C_COLOR, nvl(C_MC,C_COLOR) C_COLOR_NAME,
prior C_NAME C_SUP_NAME   
FROM TA, TCODE
where TA.C_COLOR = TCODE.C_DM(+)
start with N_SUP_ID is null
connect by prior N_ID = N_SUP_ID
/

测试数据:
INSERT INTO TA ( N_ID, C_NAME, N_SUP_ID, C_COLOR ) VALUES (
1, 'a', NULL, 'A');
INSERT INTO TA ( N_ID, C_NAME, N_SUP_ID, C_COLOR ) VALUES (
2, 'b', NULL, 'B');
INSERT INTO TA ( N_ID, C_NAME, N_SUP_ID, C_COLOR ) VALUES (
3, 'c', NULL, 'C');
INSERT INTO TA ( N_ID, C_NAME, N_SUP_ID, C_COLOR ) VALUES (
4, 'ab', 1, 'D');
INSERT INTO TA ( N_ID, C_NAME, N_SUP_ID, C_COLOR ) VALUES (
5, 'ca', 3, 'D');
INSERT INTO TA ( N_ID, C_NAME, N_SUP_ID, C_COLOR ) VALUES (
6, 'abc', 4, 'A');
INSERT INTO TA ( N_ID, C_NAME, N_SUP_ID, C_COLOR ) VALUES (
7, 'abd', 4, 'A');
INSERT INTO TA ( N_ID, C_NAME, N_SUP_ID, C_COLOR ) VALUES (
8, 'ac', 1, 'C');
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;

看看视图中的数据:
select * from tacode;
1        a                A        黑色       
8        ac        1        C        蓝色        a
4        ab        1        D        D        a
7        abd        4        A        黑色        ab
6        abc        4        A        黑色        ab
2        b                B        红色       
3        c                C        蓝色       
5        ca        3        D        D        c

当我以C_COLOR为条件做查询时:
select  * from tacode
where c_color='C';
8        ac        1        C        蓝色        a
8        ac        1        C        蓝色        a
8        ac        1        C        蓝色        a
8        ac        1        C        蓝色        a
3        c                C        蓝色       
可我想要的结果是这样才对
3        c                C        蓝色       
8        ac        1        C        蓝色        a

请问这个查询语句应该怎么写?(只能通过TACODE去查)
以C_NAME、N_ID作为条件,都不会出现这种情况。
论坛徽章:
44
双鱼座
日期:2016-01-07 20:57:31奔驰
日期:2013-08-02 22:22:552013年新春福章
日期:2013-02-25 14:51:24迷宫蛋
日期:2013-01-29 22:12:11蛋疼蛋
日期:2013-01-07 15:50:53ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28紫蛋头
日期:2011-07-31 11:27:01蜘蛛蛋
日期:2011-06-14 14:20:33蛋疼蛋
日期:2011-06-03 19:39:27SQL大赛参与纪念
日期:2011-04-13 12:08:17
2#
发表于 2005-8-2 16:57 | 只看该作者
我的测试正常呀,你的版本是?我的是 10G

使用道具 举报

回复
论坛徽章:
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
3#
 楼主| 发表于 2005-8-2 17:12 | 只看该作者
我也纳闷,刚才忘写版本了
是9.2.0.1

现在我把TACODE写成这样
select A.*,nvl(C_MC,C_COLOR) C_COLOR_NAME from
(
SELECT
N_ID, C_NAME, N_SUP_ID, C_COLOR,
prior C_NAME C_SUP_NAME   
FROM TA
start with N_SUP_ID is null
connect by prior N_ID = N_SUP_ID
) A, TCODE
where A.C_COLOR = TCODE.C_DM(+)

居然就没问题了
看了下执行计划,貌似现在这种写法效率还高
搞不懂,现在可是套了一层select的说
看来是oracle的bug了...

使用道具 举报

回复
论坛徽章:
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-8-2 17:18 | 只看该作者
在816上测试了一下
创建视图时出错
SQL> create view TACODE as
  2  SELECT
  3  N_ID, C_NAME, N_SUP_ID, C_COLOR, nvl(C_MC,C_COLOR) C_COLOR_NAME,
  4  prior C_NAME C_SUP_NAME
  5  FROM TA, TCODE
  6  where TA.C_COLOR = TCODE.C_DM(+)
  7  start with N_SUP_ID is null
  8  connect by prior N_ID = N_SUP_ID
  9  /
FROM TA, TCODE
     *
ERROR 位于第 5 行:
ORA-01437: 无法连接 CONNECT BY

ft,816还不支持这种写法

使用道具 举报

回复

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

本版积分规则 发表回复

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