请高手指教一个START WITH CONNECT BY 的问题?

leizhou90 2013-12-30 01:26:50
我写了如下语句

SELECT DISTINCT a.AUT_STATNEW
FROM R5AUTH a
where AUT_ENTITY='E'
START WITH a.AUT_STATUS ='A'
CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW

问题1.代码运行的结果是 D,C,B (A得到B,B-C,C-D) 我现在只想得到 D就可以了,语句改怎么改?
2.这个语句是先执行 where后面的条件还是 先START WITH CONNECT BY 然后在执行where后面的 条件?
...全文
176 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
leizhou90 2013-12-30
  • 打赏
  • 举报
回复
引用 6 楼 leizhou90 的回复:
[quote=引用 5 楼 zlloct 的回复:] [quote=引用 4 楼 leizhou90 的回复:] [quote=引用 3 楼 zlloct 的回复:] [quote=引用 2 楼 leizhou90 的回复:] [quote=引用 1 楼 zlloct 的回复:]
SELECT  DISTINCT   a.AUT_STATNEW
              FROM R5AUTH a                         
              where AUT_ENTITY='E'
              AND  CONNECT_BY_ISLEAF= a.AUT_STATUS 
             START WITH  a.AUT_STATUS ='A'
             CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW
是这样吗?报错提示无用的数字? 即使把 a.AUT_STATUS改成1的话出来的是 数值C 不是数字D [/quote] 那就是你的CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW这句有问题,把表数据贴出来看看。[/quote][/quote] 连接有问题,参考如下;
WITH T1 AS
 (SELECT 'A' ID, NULL PID
    FROM DUAL
  UNION ALL
  SELECT 'B' ID, 'A' PID
    FROM DUAL
  UNION ALL
  SELECT 'C' ID, 'B' PID
    FROM DUAL
  UNION ALL
  SELECT 'D' ID, 'C' PID
    FROM DUAL)
SELECT A.ID
  FROM T1 A
 WHERE CONNECT_BY_ISLEAF = 1
 START WITH A.ID = 'A'
CONNECT BY PRIOR A.ID = A.PID;
[/quote] 这个还有其他办法吗? 因为,这个是审批权限的,不同的审批单 他的授权代码不一样,而且他也不一定就是从A到D的授权,如果是A到Z的话 那是不是要写很多union? [/quote] 这个是可以的能得到一个D,是不是就说明连接没有问题?
_拙计 2013-12-30
  • 打赏
  • 举报
回复
引用 8 楼 zlloct 的回复:
[quote=引用 7 楼 lu010610 的回复:] [quote=引用 6 楼 leizhou90 的回复:] [quote=引用 5 楼 zlloct 的回复:] [quote=引用 4 楼 leizhou90 的回复:] [quote=引用 3 楼 zlloct 的回复:] [quote=引用 2 楼 leizhou90 的回复:] [quote=引用 1 楼 zlloct 的回复:]
SELECT  DISTINCT   a.AUT_STATNEW
              FROM R5AUTH a                         
              where AUT_ENTITY='E'
              AND  CONNECT_BY_ISLEAF= a.AUT_STATUS 
             START WITH  a.AUT_STATUS ='A'
             CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW
是这样吗?报错提示无用的数字? 即使把 a.AUT_STATUS改成1的话出来的是 数值C 不是数字D [/quote] 那就是你的CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW这句有问题,把表数据贴出来看看。[/quote][/quote] 连接有问题,参考如下;
WITH T1 AS
 (SELECT 'A' ID, NULL PID
    FROM DUAL
  UNION ALL
  SELECT 'B' ID, 'A' PID
    FROM DUAL
  UNION ALL
  SELECT 'C' ID, 'B' PID
    FROM DUAL
  UNION ALL
  SELECT 'D' ID, 'C' PID
    FROM DUAL)
SELECT A.ID
  FROM T1 A
 WHERE CONNECT_BY_ISLEAF = 1
 START WITH A.ID = 'A'
CONNECT BY PRIOR A.ID = A.PID;
[/quote] 这个还有其他办法吗? 因为,这个是审批权限的,不同的审批单 他的授权代码不一样,而且他也不一定就是从A到D的授权,如果是A到Z的话 那是不是要写很多union? [/quote]这个union all只是他自己写的临时测试表[/quote] 哥们,还是你了解我[/quote]
u013320461 2013-12-30
  • 打赏
  • 举报
回复
引用 楼主 leizhou90 的回复:
我写了如下语句 SELECT DISTINCT a.AUT_STATNEW FROM R5AUTH a where AUT_ENTITY='E' START WITH a.AUT_STATUS ='A' CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW 问题1.代码运行的结果是 D,C,B (A得到B,B-C,C-D) 我现在只想得到 D就可以了,语句改怎么改? 2.这个语句是先执行 where后面的条件还是 先START WITH CONNECT BY 然后在执行where后面的 条件?
给你在最后加了一行
SELECT  DISTINCT   a.AUT_STATNEW
              FROM R5AUTH a                         
              where AUT_ENTITY='E'   
             START WITH  a.AUT_STATUS ='A'
             CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW 
                     AND LEVEL = 1
CT_LXL 2013-12-30
  • 打赏
  • 举报
回复
引用 7 楼 lu010610 的回复:
[quote=引用 6 楼 leizhou90 的回复:] [quote=引用 5 楼 zlloct 的回复:] [quote=引用 4 楼 leizhou90 的回复:] [quote=引用 3 楼 zlloct 的回复:] [quote=引用 2 楼 leizhou90 的回复:] [quote=引用 1 楼 zlloct 的回复:]
SELECT  DISTINCT   a.AUT_STATNEW
              FROM R5AUTH a                         
              where AUT_ENTITY='E'
              AND  CONNECT_BY_ISLEAF= a.AUT_STATUS 
             START WITH  a.AUT_STATUS ='A'
             CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW
是这样吗?报错提示无用的数字? 即使把 a.AUT_STATUS改成1的话出来的是 数值C 不是数字D [/quote] 那就是你的CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW这句有问题,把表数据贴出来看看。[/quote][/quote] 连接有问题,参考如下;
WITH T1 AS
 (SELECT 'A' ID, NULL PID
    FROM DUAL
  UNION ALL
  SELECT 'B' ID, 'A' PID
    FROM DUAL
  UNION ALL
  SELECT 'C' ID, 'B' PID
    FROM DUAL
  UNION ALL
  SELECT 'D' ID, 'C' PID
    FROM DUAL)
SELECT A.ID
  FROM T1 A
 WHERE CONNECT_BY_ISLEAF = 1
 START WITH A.ID = 'A'
CONNECT BY PRIOR A.ID = A.PID;
[/quote] 这个还有其他办法吗? 因为,这个是审批权限的,不同的审批单 他的授权代码不一样,而且他也不一定就是从A到D的授权,如果是A到Z的话 那是不是要写很多union? [/quote]这个union all只是他自己写的临时测试表[/quote] 哥们,还是你了解我
_拙计 2013-12-30
  • 打赏
  • 举报
回复
引用 6 楼 leizhou90 的回复:
[quote=引用 5 楼 zlloct 的回复:] [quote=引用 4 楼 leizhou90 的回复:] [quote=引用 3 楼 zlloct 的回复:] [quote=引用 2 楼 leizhou90 的回复:] [quote=引用 1 楼 zlloct 的回复:]
SELECT  DISTINCT   a.AUT_STATNEW
              FROM R5AUTH a                         
              where AUT_ENTITY='E'
              AND  CONNECT_BY_ISLEAF= a.AUT_STATUS 
             START WITH  a.AUT_STATUS ='A'
             CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW
是这样吗?报错提示无用的数字? 即使把 a.AUT_STATUS改成1的话出来的是 数值C 不是数字D [/quote] 那就是你的CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW这句有问题,把表数据贴出来看看。[/quote][/quote] 连接有问题,参考如下;
WITH T1 AS
 (SELECT 'A' ID, NULL PID
    FROM DUAL
  UNION ALL
  SELECT 'B' ID, 'A' PID
    FROM DUAL
  UNION ALL
  SELECT 'C' ID, 'B' PID
    FROM DUAL
  UNION ALL
  SELECT 'D' ID, 'C' PID
    FROM DUAL)
SELECT A.ID
  FROM T1 A
 WHERE CONNECT_BY_ISLEAF = 1
 START WITH A.ID = 'A'
CONNECT BY PRIOR A.ID = A.PID;
[/quote] 这个还有其他办法吗? 因为,这个是审批权限的,不同的审批单 他的授权代码不一样,而且他也不一定就是从A到D的授权,如果是A到Z的话 那是不是要写很多union? [/quote]这个union all只是他自己写的临时测试表
leizhou90 2013-12-30
  • 打赏
  • 举报
回复
引用 5 楼 zlloct 的回复:
[quote=引用 4 楼 leizhou90 的回复:] [quote=引用 3 楼 zlloct 的回复:] [quote=引用 2 楼 leizhou90 的回复:] [quote=引用 1 楼 zlloct 的回复:]
SELECT  DISTINCT   a.AUT_STATNEW
              FROM R5AUTH a                         
              where AUT_ENTITY='E'
              AND  CONNECT_BY_ISLEAF= a.AUT_STATUS 
             START WITH  a.AUT_STATUS ='A'
             CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW
是这样吗?报错提示无用的数字? 即使把 a.AUT_STATUS改成1的话出来的是 数值C 不是数字D [/quote] 那就是你的CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW这句有问题,把表数据贴出来看看。[/quote][/quote] 连接有问题,参考如下;
WITH T1 AS
 (SELECT 'A' ID, NULL PID
    FROM DUAL
  UNION ALL
  SELECT 'B' ID, 'A' PID
    FROM DUAL
  UNION ALL
  SELECT 'C' ID, 'B' PID
    FROM DUAL
  UNION ALL
  SELECT 'D' ID, 'C' PID
    FROM DUAL)
SELECT A.ID
  FROM T1 A
 WHERE CONNECT_BY_ISLEAF = 1
 START WITH A.ID = 'A'
CONNECT BY PRIOR A.ID = A.PID;
[/quote] 这个还有其他办法吗? 因为,这个是审批权限的,不同的审批单 他的授权代码不一样,而且他也不一定就是从A到D的授权,如果是A到Z的话 那是不是要写很多union?
CT_LXL 2013-12-30
  • 打赏
  • 举报
回复
引用 4 楼 leizhou90 的回复:
[quote=引用 3 楼 zlloct 的回复:] [quote=引用 2 楼 leizhou90 的回复:] [quote=引用 1 楼 zlloct 的回复:]
SELECT  DISTINCT   a.AUT_STATNEW
              FROM R5AUTH a                         
              where AUT_ENTITY='E'
              AND  CONNECT_BY_ISLEAF= a.AUT_STATUS 
             START WITH  a.AUT_STATUS ='A'
             CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW
是这样吗?报错提示无用的数字? 即使把 a.AUT_STATUS改成1的话出来的是 数值C 不是数字D [/quote] 那就是你的CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW这句有问题,把表数据贴出来看看。[/quote][/quote] 连接有问题,参考如下;
WITH T1 AS
 (SELECT 'A' ID, NULL PID
    FROM DUAL
  UNION ALL
  SELECT 'B' ID, 'A' PID
    FROM DUAL
  UNION ALL
  SELECT 'C' ID, 'B' PID
    FROM DUAL
  UNION ALL
  SELECT 'D' ID, 'C' PID
    FROM DUAL)
SELECT A.ID
  FROM T1 A
 WHERE CONNECT_BY_ISLEAF = 1
 START WITH A.ID = 'A'
CONNECT BY PRIOR A.ID = A.PID;
leizhou90 2013-12-30
  • 打赏
  • 举报
回复
引用 3 楼 zlloct 的回复:
[quote=引用 2 楼 leizhou90 的回复:]
[quote=引用 1 楼 zlloct 的回复:]
SELECT  DISTINCT   a.AUT_STATNEW
FROM R5AUTH a
where AUT_ENTITY='E'
AND CONNECT_BY_ISLEAF= a.AUT_STATUS
START WITH a.AUT_STATUS ='A'
CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW
是这样吗?报错提示无用的数字? 即使把 a.AUT_STATUS改成1的话出来的是 数值C 不是数字D [/quote]
那就是你的CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW这句有问题,把表数据贴出来看看。[/quote]
CT_LXL 2013-12-30
  • 打赏
  • 举报
回复
引用 2 楼 leizhou90 的回复:
[quote=引用 1 楼 zlloct 的回复:]
SELECT  DISTINCT   a.AUT_STATNEW
              FROM R5AUTH a                         
              where AUT_ENTITY='E'
              AND  CONNECT_BY_ISLEAF= a.AUT_STATUS 
             START WITH  a.AUT_STATUS ='A'
             CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW
是这样吗?报错提示无用的数字? 即使把 a.AUT_STATUS改成1的话出来的是 数值C 不是数字D [/quote] 那就是你的CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW这句有问题,把表数据贴出来看看。
leizhou90 2013-12-30
  • 打赏
  • 举报
回复
引用 1 楼 zlloct 的回复:
SELECT  DISTINCT   a.AUT_STATNEW
              FROM R5AUTH a                         
              where AUT_ENTITY='E'
              AND  CONNECT_BY_ISLEAF= a.AUT_STATUS 
             START WITH  a.AUT_STATUS ='A'
             CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW
是这样吗?报错提示无用的数字? 即使把 a.AUT_STATUS改成1的话出来的是 数值C 不是数字D
CT_LXL 2013-12-30
  • 打赏
  • 举报
回复
SELECT  DISTINCT   a.AUT_STATNEW
              FROM R5AUTH a                         
              where AUT_ENTITY='E'
              AND  CONNECT_BY_ISLEAF= a.AUT_STATUS 
             START WITH  a.AUT_STATUS ='A'
             CONNECT BY a.AUT_STATUS = PRIOR a.AUT_STATNEW

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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