Oracle實現遞歸查詢


前幾天在開發的過程中遇到一個遞歸查詢的問題,java代碼大致是這樣的:

      // 遞歸得到四級機構對象
	public UserManagerDept getuserManagerDeptBy(String deptId)
	{

		UserManagerDept userManagerDept = null;
		
			userManagerDept = userManagerDeptService.getUserManagerDeptEntityBydeptId(deptId);
			if (null == userManagerDept)
			{
				return null;
			}
				
			if (!StringUtils.isNullOrEmpty(userManagerDept.getParentId()))
			{
				logger.info("***getParentId****" + userManagerDept.getParentId());
				return getuserManagerDeptBy(userManagerDept.getParentId());
				
			} else
			{
				return userManagerDept;
			}
			
		return null;

	}

  邏輯是不是十分簡單,但是一執行就死循環,並且一直循環到內存溢出,系統崩潰為止,有個同事一直在懷疑是不是內存太小了,但是我認為是不可能的,因為我們的運行服務器挺大的(2g), 實在找不到問題在哪,后來就換了種方式來實現遞歸, 那就是修改sql,將普通的sql查詢語句,換成遞歸查詢,下面上代碼:

select t.* from (
select t.* from t_dept t start with t.dept_id = '1041001210001'
connect by prior t.parent_id = t.dept_id) t
where t.parent_id is null;

  注意代碼中高亮顯示的內容,通過.....start with ...connect by prior...來實現遞歸查詢,是不是看不太懂,再詳細一點好了,

一,基本語法
SELECT ... FROM
(

SELECT ... FROM    + 表名 
START WITH         + 條件1
CONNECT BY PRIOR   + 條件2

)
WHERE              + 條件3

二,應用場景

    START WITH... CONNECT BY PRIOR...常見的用法,是用來遍歷含有父子關系的表結構中。比如省市關系,一個省
下面包含多個城市,如果城市基本信息表中,包含有屬於哪個省級的字段,那么如果要遍歷所有的城市,我們就可以
使用START WITH... CONNECT BY PRIOR...。

 

如果該內容對您有所幫助,請打賞----1毛就足夠感動我

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM