2014-05-15 28 views
0

我寫的遵循遞歸查詢,讓我說,我需要ID列表和它工作得很好:執行遞歸查詢DB2中我收到了SQL代碼-340

with rec_table (emailid) as 
((select email.id as emailid from email, addressee, address, use, user 
    where email.id = addressee.EMAIL and addressee.to = address.ID 
    and address.id = use.ADDRESS and use.user = user.id and user.id = user_t(121)) 
union 
(select email.id as emailid from email, address, use, user 
    where email.from = address.id 
    and address.ID = use.ADDRESS and use.user = user.id and user.id = user_t(121)) 

union all 

select email.id as emailid from email, rec_table as x 
where email.contained_in = x.emailid) 

select * from rec_table 

但是,如果我需要做一些更詳細說明與查詢的結果,就像下面的查詢,我收到

with rec_table (emailid) as 
((select email.id as emailid from email, addressee, address, use, user 
    where email.id = addressee.EMAIL and addressee.to = address.ID 
    and address.id = use.ADDRESS and use.user = user.id and user.id = user_t(121)) 
union 
(select email.id as emailid from email, address, use, user 
    where email.from = address.id 
    and address.ID = use.ADDRESS and use.user = user.id and user.id = user_t(121)) 

union all 

select email.id as emailid from email, rec_table as x 
where email.contained_in = x.emailid) 

select user.id, address.id from rec_table as x, addressee, address, use, user 
where x.emailid = addressee.EMAIL and addressee.to = address.ID 
and address.id = use.ADDRESS and use.user = user.id 

我收到了一條錯誤的SQL錯誤代碼-340:

SQL錯誤[42726]:公共表表達式「」與另一個公共表表達式「 」具有相同的 定義。錯誤[56098]:在隱式 系統操作類型「2」期間發生錯誤。返回的錯誤信息包括 SQLCODE「-340」,SQLSTATE「42726」和消息標記「」。SQLCODE = -727, SQLSTATE = 56098,DRIVER = 4.16.53公用表表達式「」具有相同的標識符 作爲同一語句中公用表表達式 定義的另一個發生.. SQLCODE = -340,SQLSTATE = 42726, DRIVER = 53年4月16日

任何想法?

回答

0

嘗試將遞歸初始化部分變成自己的CTE:

with blah (emailid) as 
((select email.id as emailid from email, addressee, address, use, user 
    where email.id = addressee.EMAIL and addressee.to = address.ID 
    and address.id = use.ADDRESS and use.user = user.id and user.id = user_t(121)) 
union 
(select email.id as emailid from email, address, use, user 
    where email.from = address.id 
    and address.ID = use.ADDRESS and use.user = user.id and user.id = user_t(121)) 
), 
rec_table (emailid) as (

    select emailid from blah 
union all 
    select email.id as emailid from email, rec_table as x 
    where email.contained_in = x.emailid) 

select user.id, address.id from rec_table as x, addressee, address, use, user 
where x.emailid = addressee.EMAIL and addressee.to = address.ID 
and address.id = use.ADDRESS and use.user = user.id 

注:未測試。