oracle遞歸,只顯示up_id=根節點的問題


部門表(bumen)
id(主鍵)                        up_id(上級id)                    bumen
151F466EBB2846FA91830D98682ADB8D                                     公司
4BBDBA04DDBC4A58A57302374A045CBB  151F466EBB2846FA91830D98682ADB8D   A部門
418C737F7C9F4D3490B521F7E0F85377  4BBDBA04DDBC4A58A57302374A045CBB   A部門->a班組
E02F9A3530C14EC9B905F7E016A59B05  4BBDBA04DDBC4A58A57302374A045CBB   A部門->b班組
7E98ACEF45634BA08C50CB5544FA60BC  E02F9A3530C14EC9B905F7E016A59B05   A部門->b班組->a小隊
285470122951413F96B85B0664FB63C6  151F466EBB2846FA91830D98682ADB8D   B部門
AF489E4D28E44889A0680F7BEC76BA6E  285470122951413F96B85B0664FB63C6   B部門->a班組
1527372AC7A94139A02A2F876EA0B68F  151F466EBB2846FA91830D98682ADB8D   C部門


記錄表(jilu)
id(主鍵)                        bumen(部門,取的bumen表id)       neirong(內容)         riqi(日期)
B0CC08491CF54E56811F73C65B79E115  4BBDBA04DDBC4A58A57302374A045CBB   對A部門提出**考核       2010/1/1
E60CDB3D55E44B4082EEABE3B7AFCC0C  418C737F7C9F4D3490B521F7E0F85377   對A部門a班組提出**考核  2010/1/2
EDC0028B909345B8B19899A88DF96675  E02F9A3530C14EC9B905F7E016A59B05   對A部門b班組提出**考核  2010/1/3
EA72F52459EA4197B79D2BE4471270FE  AF489E4D28E44889A0680F7BEC76BA6E   對B部門a班組提出**考核  2010/1/4
8F5D9BF1B7454D73B70B6B95052D250F  1527372AC7A94139A02A2F876EA0B68F   對C部門提出**考核       2010/2/1

我想實現,以部門為單位(即只顯示up_id=根節點的數據),如下:

id                                bumen
4BBDBA04DDBC4A58A57302374A045CBB  A部門
285470122951413F96B85B0664FB63C6  B部門

我寫了以下語句:
select b.id,b.bumen from a jilu a left join bumen b on a.bumen=b.id where riqi>=to_date('2010-01-01 00:00:00','yyyy-MM-dd hh24:mi:ss') and riqi<=to_date('2010-01-31 23:59:59','yyyy-MM-dd hh24:mi:ss')
可是現實結果卻是:
id                                bumen
4BBDBA04DDBC4A58A57302374A045CBB  A部門
418C737F7C9F4D3490B521F7E0F85377  A部門->a班組
E02F9A3530C14EC9B905F7E016A59B05  A部門->b班組
7E98ACEF45634BA08C50CB5544FA60BC  A部門->b班組->a小隊
285470122951413F96B85B0664FB63C6  B部門
AF489E4D28E44889A0680F7BEC76BA6E  B部門->a班組
請問各位高人如何實現如下效果(即只顯示up_id=根節點的數據):
id                                bumen
4BBDBA04DDBC4A58A57302374A045CBB  A部門
285470122951413F96B85B0664FB63C6  B部門

14 个解决方案

#1


--確保公司的up_id為null
select b.id, b.bumen
  from a jilu a
  left join (select id,bumen from bumen t where 
    up_id is not null start with up_id is null 
    connect by prior id=up_id and level=2) b
    on a.bumen = b.id
 where riqi >= to_date('2010-01-01 00:00:00', 'yyyy-MM-dd hh24:mi:ss')
   and riqi <= to_date('2010-01-31 23:59:59', 'yyyy-MM-dd hh24:mi:ss')

#2


不用connect by了,只需要用where條件就可以。
樓主想復雜了吧

#3


謝謝tangren的解答,但是我查詢出來卻是
id                                bumen 
沒有數據                               沒有數據 
285470122951413F96B85B0664FB63C6  B部門
也就是如果這條記錄恰好在level=2上,則有顯示,如果這條記錄所在部門比level=2深,比如A部門->b班組->a小隊,則沒有記錄,是一個空行。

#4


select * from tb
where up_id='151F466EBB2846FA91830D98682ADB8D'

#5


你好,我們的需求是多表聯合,查出第二級節點。

#6


你就不要用左連接,用等連接就可以了嘛

#7


with bumen as(
select '151F466EBB2846FA91830D98682ADB8D' id,   null                              up_id,  '公司'                bumen from dual union all  
select '4BBDBA04DDBC4A58A57302374A045CBB' id,  '151F466EBB2846FA91830D98682ADB8D' up_id,  'A部門'               bumen from dual union all
select '418C737F7C9F4D3490B521F7E0F85377' id,  '4BBDBA04DDBC4A58A57302374A045CBB' up_id,  'A部門->a班組'        bumen from dual union all
select 'E02F9A3530C14EC9B905F7E016A59B05' id,  '4BBDBA04DDBC4A58A57302374A045CBB' up_id,  'A部門->b班組'        bumen from dual union all
select '7E98ACEF45634BA08C50CB5544FA60BC' id,  'E02F9A3530C14EC9B905F7E016A59B05' up_id,  'A部門->b班組->a小隊' bumen from dual union all 
select '285470122951413F96B85B0664FB63C6' id,  '151F466EBB2846FA91830D98682ADB8D' up_id,  'B部門'               bumen from dual union all
select 'AF489E4D28E44889A0680F7BEC76BA6E' id,  '285470122951413F96B85B0664FB63C6' up_id,  'B部門->a班組'        bumen from dual union all
select '1527372AC7A94139A02A2F876EA0B68F' id,  '151F466EBB2846FA91830D98682ADB8D' up_id,  'C部門'               bumen from dual),
jilu as(
select 'B0CC08491CF54E56811F73C65B79E115' id,  '4BBDBA04DDBC4A58A57302374A045CBB' bumen, '對A部門提出**考核'       neirong, date '2010-1-1' riqi from dual union all 
select 'E60CDB3D55E44B4082EEABE3B7AFCC0C' id,  '418C737F7C9F4D3490B521F7E0F85377' bumen, '對A部門a班組提出**考核'  neirong, date '2010-1-2' riqi from dual union all 
select 'EDC0028B909345B8B19899A88DF96675' id,  'E02F9A3530C14EC9B905F7E016A59B05' bumen, '對A部門b班組提出**考核'  neirong, date '2010-1-3' riqi from dual union all 
select 'EA72F52459EA4197B79D2BE4471270FE' id,  'AF489E4D28E44889A0680F7BEC76BA6E' bumen, '對B部門a班組提出**考核'  neirong, date '2010-1-4' riqi from dual union all 
select '8F5D9BF1B7454D73B70B6B95052D250F' id,  '1527372AC7A94139A02A2F876EA0B68F' bumen, '對C部門提出**考核'       neirong, date '2010-2-1' riqi from dual)

select b.id, b.bumen
  from jilu a
  join (select id,bumen from bumen t where 
    up_id is not null start with up_id is null 
    connect by prior id=up_id and level=2) b
    on a.bumen = b.id
 where riqi >= to_date('2010-01-01 00:00:00', 'yyyy-MM-dd hh24:mi:ss')
   and riqi <= to_date('2010-01-31 23:59:59', 'yyyy-MM-dd hh24:mi:ss')

#8


您好,如果這樣的話就沒有以下記錄了
id                                bumen 
4BBDBA04DDBC4A58A57302374A045CBB  A部門

#9


在那個時間段符合條件的2級部門只有A部門一條記錄啊,
在這個時間段你想要顯示的結果集是什么?

#10


因為
A部門->a班組 
A部門->b班組 
A部門->b班組->a小隊
都屬於A部門,而他們在sql語句中又有記錄,所以我想讓
id                                bumen 
4BBDBA04DDBC4A58A57302374A045CBB  A部門

這條記錄出現。

#11


你執行一下7樓語句,就是如下結果
id                                bumen 
4BBDBA04DDBC4A58A57302374A045CBB  A部門 

#12


對不起,我原始的需求描述有誤,是這樣的,應該沒有下面記錄:
select 'B0CC08491CF54E56811F73C65B79E115' id,  '4BBDBA04DDBC4A58A57302374A045CBB' bumen, '對A部門提出**考核'       neirong, date '2010-1-1' riqi from dual union all

也就是A部門這個根部門下面沒有記錄,而A部門下面的子部門有記錄,這樣的話如何顯示:
 id                                bumen 
4BBDBA04DDBC4A58A57302374A045CBB  A部門 

抱歉,是我的失誤。

#13


--再寫一個了
with mybumen as   
(SELECT a.lv, a.id, a.bumen, b.id id2, b.bumen bumen2, b.lv lv2
  FROM (SELECT LEVEL lv, id, bumen, sys_connect_by_path(id, ',') conn
          FROM bumen t
         START WITH up_id IS NULL
        CONNECT BY PRIOR id = up_id) a,
       (SELECT *
          FROM (SELECT LEVEL lv, id, bumen
                  FROM bumen t
                 START WITH up_id IS NULL
                CONNECT BY PRIOR id = up_id)
         WHERE lv = 2) b
 WHERE instr(a.conn, b.id) > 0)
SELECT distinct b.id2, b.bumen2
  FROM jilu a, mybumen b
 WHERE a.bumen = b.id AND
       riqi >= to_date('2010-01-01 00:00:00', 'yyyy-MM-dd hh24:mi:ss') AND
       riqi <= to_date('2010-01-31 23:59:59', 'yyyy-MM-dd hh24:mi:ss');

#14


真的很感謝您!!!

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com