我一直認爲With
子句是作爲一次性執行語句工作的,它的行爲與普通表一樣 - 您可以像在常規表上一樣對其執行所有SQL操作。使用子句執行
但事實證明,在多個數據庫(Oracle,Netezza,Sybase,Teradata)中,每次使用with
子句時都會執行該子句。
With Test as(
select random() --pseudo code
)
select '1st select', * from Test
union
select '2nd select', * form Test
而不是2個相同的數字,上面的查詢返回2個不同的數字,所以它是爲每個選擇執行。
如果我在With
子句中有一個非常複雜的查詢,並且在查詢的其餘部分使用了5次,它將執行5次,這對我來說似乎非常無效。
那麼有人能給我一個很好的邏輯理由嗎?
Postgres的返回兩個外選擇相同的號碼。所以CTE只運行一次 –
在Oracle'WITH test(rnd)AS(SELECT/* + MATERIALIZE */DBMS_RANDOM.VALUE FROM DUAL)SELECT'a',t。* FROM test t UNION ALL SELECT'b', t。* FROM test t;'給出了兩個相同的數字。 – MT0