資料庫樹查詢,資料庫樹

來源:互聯網
上載者:User

資料庫樹查詢,資料庫樹

這一段時間在實習的公司裡和別人共同開發一個新功能,我主要偏資料庫操作!其中有一個是對資料的校正,而這些資料在資料庫裡是以樹的形式存在!沒有問別人之前我是打算以迴圈的方式來做,周日花了整整一下午把資料表研究了一番發現不是我想象的那麼簡單,我先把這個要求簡單的描述一下:

首先是資料表裡的資料,欄位太多,我只查出一些有用的欄位:


id是主鍵是主鍵由資料庫自動產生,itemtype是類型,這些資料又兩種類型,一個是分類,一個是條目(下一張圖片會明白),name是名稱,parentid是直屬上級id(要是之前有接觸過樹形結構資料表的,會對parentid很熟悉)

再來是資料需要顯示的效果:


沒錯,這是EXCEL表格,可以講上面的資料和這個表格對應起來比較一下,每行內容後面的資料是我手動添加上去的,代表的是當前的id。

簡單的解釋一下,parentid為空白的代表A列,也就是最進階節點,比如id為8和9的,然後parentid為8或9的就是B列的資料,然後是C列, 以此類推。。。最末級成為條目itemtype為1,其餘的為分類,itemtype為0,8~13就是分類,14~23就是條目,介紹完了,下面是要求,每一個條目(包括本身)的所有上級,必須有且只有一個分類或條目指定有效基分(有效基分是其他資料表裡的欄位這個不需要理會,他們之間的聯絡是id)

不知道大家看完之後會使用什麼樣的方法校正,我記得那天下午把資料表弄了明白之後,用迴圈的方式進行校正的,因為這樣的樹形資料表之前聽也沒聽說過,這次是第一次接觸。。。

第二天上班問了老員工,問她會使用什麼樣的方法進行校正,她說了一句“用樹查詢啊!”我一愣?後面的就沒有聽下去,樹查詢是什麼東東啊!急忙跑去問度娘,溫柔的度娘“啪”的一聲羅列出幾百萬條記錄,我簡單的看了一下,尋找我能用到的答案!

樹查詢文法:

     

    select ... from tablename start with 條件1  connect by 條件2  where 條件3;

       條件1 是根結點的限定語句,就是以什麼欄位為節點(一般以id)當然可以放寬限定條件,以取得多個根結點,實際就是多棵樹。
  條件2 是串連條件,其中用PRIOR表示上一條記錄,這一點容易混淆

  • connect by prior parentid = t.id表示上一條記錄的parentid是本條記錄的id,也就是說本條記錄是上一條的父級節點,就表示以條件1為節點查出來的都是父級節點;
  • connect by priorid = t.parentid表示上一條記錄的id是本條記錄的parentid,也就是說本條記錄本條記錄是上一級的子節點,就表示以條件1為節點,查出來的都是子節點。

  條件3 是過濾條件,用於對返回的所有記錄進行過濾

這一句就解決了我的問題!

首先我先在另一張表裡將有效積分資料的id找出來,通過id將資料從樹形表裡取出來放在一個list裡,然後遍曆list,使用尋找所有父節點SQL語句:

select * from tableName t where  t.id != :itemId start with t.id = :itemId connect by prior parentid = t.id;
裡面有個條件是

t.id != :itemId
是為了將本身節點剔除,防止查出來的資料包含自身節點
查出來的資料放在parentList,然後再遍曆,通過id查詢另一張表裡對應的資料下是否為有效積分,沒有的話繼續遍曆下一個否則拋出異常,提示校正失敗!

然後使用尋找所有子節點SQL語句:

<span style="font-family:Microsoft YaHei;font-size:14px;">select * from tableName t where  t.id != :itemId start with t.id = :itemId connect by prior <span style="line-height: 16.8999996185303px;">id</span> = t.<span style="line-height: 16.8999996185303px;">parentid</span>;</span>
同樣使用遍曆的方法進行校正

就如,以10為節點,先將所有的父級查出來進行校正,再將所有的子級查出來進行校正

樹查詢的好處就是一次性的將所有的父節點或子節點查出來。

就這樣一個SQL語句解決了很多的問題,中途也不會出錯,做開發最後還是對資料庫的操作,就看你能不能hold住!!!

對了,這裡我只是使用樹查詢最簡單的應用,如果還想深入一點的瞭解,介紹一片博文:

http://www.blogjava.net/hwpok/archive/2010/04/07/317649.html

講的比較詳細,當然了度娘那裡有更多!



相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.