2015-10-19 79 views
0

對於我的項目,我使用rdbms實現鏈接列表。鏈表使用rowid列作爲指針,並且包含先前,下一個和所有者指針(來自不同的表)。檢索關係數據庫中鏈接列表的條目

簡單的例子就是這樣。

CREATE TABLE EMPLOYEE 
    (
     EMP_ID   NUMBER(4) NOT NULL, 
     OFFICE_CODE  CHAR(2), 
     OFF_EMP_prior ROWID, 
     OFF_EMP_next ROWID, 
     OFF_EMP_owner ROWID 
    ); 

{EMP1,(NULL,EMP2,OFF1)} - {EMP2,(EMP1,EMP3,OFF1)} - {EMP3,(EMP2,NULL,OFF1)}

現在我要實現像「具有‘OFF1’作爲所有者列表找到‘第n(整數)’條目」檢索功能。

這可以通過使用循環遍歷鏈表完成。但是這需要太多的SQL操作來進行一次檢索。 (我知道,使用序列號可以是另一種選擇,但是這是迄今爲止所作的決定。)

相反,我在Oracle SQL找到SELECT - CONNECTED BY,並試圖

select * from EMPLOYEE 
where OFF_EMP_owner = [OFF_ROWID] 
connect by nocycle OFF_EMP_prior = rowid; 

此查詢的工作檢索條目的名單,但結果的順序不是我所期望的(如EMP3-EMP1-EMP2)。

是否有可能檢索鏈接列表中的條目並按SELECT-CONNECT BY'的列表順序排序它們?或者是否存在更適合的SQL?

+0

rowid是一個不錯的選擇;你應該鏈接/連接到自然或代理鍵。通常,在(遞歸)中,具有* parent *指針的SQL是可能的,但在大多數情況下,從建模的角度來看,它是次優的。 – wildplasser

+0

它取決於你使用的是哪個數據庫環境,如果它是SQL Server,我會建議使用公用表表達式。 – ydoow

+0

順便說一句:你的*表*沒有主鍵,所以它甚至不是一張表(在2NF意義上) – wildplasser

回答

0
select * from EMPLOYEE 
where DEPT_EMPLOYEE_owner = [OWNER_ROWID} 
start with OFF_EMP_prior is NULL 
connect by OFF_EMP_prior = prior rowid; 

解決了上述查詢的問題。 'before'應該用來代替nocycle。