2011-04-17 143 views
3

HI,SQL - 使用WHERE語句

WITH狀態是否可以存在於WHERE子句中?

例如:

SELECT tbl1.name , tbl1.ID 
FROM DBTABLE0001 AS tbl1 
WHERE ( 
    exists(

     WITH H (super, ID, depth) AS 
     ( 
     SELECT ROOT.parent, ROOT.ID , 0 
     FROM DBTABLE0001 ROOT 
     WHERE ROOT.ID = tbl1.ID 

     UNION ALL 

     SELECT PARENT.parent, PARENT.ID , CHILD.depth + 1 
     FROM H CHILD, DBTABLE0001 PARENT 
     WHERE PARENT.ID = CHILD.super 

     ) 

     SELECT ID 
     FROM H 
     WEHER H.ID = "abcd" 
     ORDER BY depth 

    ) 
) 

感謝, 密蘇里州

+1

歡迎在StackOverflow。下次請使用{}按鈕來格式化您的代碼。 – Codo 2011-04-17 08:56:32

+1

你試過了嗎? (*你應該把'WEHER'改成'WHERE' * – 2011-04-17 08:57:42

+0

你有沒有特別的DBMS? – 2011-04-17 09:03:08

回答

4

你應該把你與你的查詢的開頭陳述。那麼你可以在任何地方使用它:

WITH H (super, ID, depth) AS   
      (SELECT ROOT.parent, ROOT.ID , 0 
        FROM DBTABLE0001 ROOT    
       WHERE ROOT.ID = DBTABLE0001.ID    
       UNION ALL    
       SELECT PARENT.parent, PARENT.ID , CHILD.depth + 1       FROM H CHILD, DBTABLE0001 PARENT   
       WHERE PARENT.ID = CHILD.super) 

SELECT tbl1.name , tbl1.ID  
    FROM DBTABLE0001 AS tbl1 
    WHERE (exists(SELECT ID FROM H WEHER H.ID = "abcd" ORDER BY depth)) 
+0

問題在於WITH涉及主要選擇FROM表: WHERE ROOT.ID = tbl1.ID tbl1參數是外部選擇表。 – MoG 2011-04-17 09:32:56

+0

將其重命名爲表名。 – 2011-04-17 09:42:44

+0

但是它不會在正確的上下文中運行 - 這也是db2在大喊:SQL0206N「DBTABLE0001.ID」在使用它的上下文中無效 – MoG 2011-04-17 09:50:49