2013-12-15 29 views
0

我正在嘗試編寫一條SQL語句,它在Oracle中多次重複使用With子句的子查詢。對Oracle中的整個SQL語句使用子句子查詢可用性

With mySubQ as (
    ... 
) 

Select Something 

From SomeTable, 
(
    Select * 
    From mySubQ 
    where mySubQ.Something >= 0 
) newSubQ 

where mySubQ.Something = SomeTable.Something 

這給了我錯誤 - ORA-32034不支持使用WITH子句

我缺少什麼?

+0

您需要的子查詢和'之間的逗號newSubQ'。但是如果你使用ANSI JOIN語法會更好。 – Barmar

+0

我不明白。 newSubQ只是括號內SQL語句的別名吧?你在哪裏建議我放一個逗號? – yudistrange

+0

對不起,我把'newSubQ'與'mySubQ'混淆了。 – Barmar

回答

5

您需要加入mySubQ,而不只是定義它。

WITH mySubQ AS (...) 
SELECT Something 
FROM SomeTable 
JOIN mySubQ ON mySubQ.Something = SomeTable.Something 
WHERE mySubQ.Something >= 0 

如果你把mySubQ查詢在子查詢中,你不能在主查詢的WHERE子句中引用mySubQ。每個查詢級別只能訪問其自己的FROMJOIN子句中的表,而不是子查詢中的表。

+0

你在評論中有什麼,(*「外部查詢中的WHERE子句不能引用子查詢中的表」,*),我想也應該在你的答案中。 –

+0

感謝您的建議。我已經添加了更多的解釋。 – Barmar

1

這是錯誤:where mySubQ.Something = SomeTable.Something

底部查詢從SomeTable和從子查詢與別名newSubQ, 所以mySubQ.Something未在此上下文中已知的選擇。

如果something是一個真正的列名,不僅是「僞代碼佔位符」,然後還有這裏的另一個錯誤:Select Something - 列是模糊的,因爲這兩個sometable和子查詢有此列。

嘗試此查詢:

With mySubQ as (
    SELECT * FROM sometable 
) 

Select newSubQ.Something 

From SomeTable, 
(
    Select * 
    From mySubQ 
    where mySubQ.Something >= 0 
) newSubQ 

where newSubQ.Something = SomeTable.Something 
; 

演示 - >http://www.sqlfiddle.com/#!4/88855/12

該演示還包含使用WITH條款的另一個例子:

WITH mySubQ AS (
    SELECT * 
    FROM sometable 
), 

mySubQ_1 AS (
    SELECT * 
    FROM mySubQ 
    WHERE somethingelse = 1 
), 

mySubQ_2 AS (
    SELECT * 
    FROM mySubQ 
    WHERE something between 2 AND 5 
) 

SELECT * 
FROM sometable s, mySubQ_1 m1, 
    (
     SELECT * FROM mySubQ_2 
     WHERE something < 10 
    ) m2 
WHERE s.something = m1.something 
    AND m1.somethingelse = m2.somethingelse 
+0

我不認爲他的意思是'Something'作爲實際的列名,他寫的是僞代碼,看起來像一個佔位符。 – Barmar

+0

@Barmar謝謝你指出,我已經改變了我的答案。 – krokodilko