Oracle 中的 CTE(Common Table Expression,公用表表達式)是一種臨時的結果集,可以在 SQL 查詢中引用。它使用 WITH 子句定義,使複雜查詢更清晰、可讀性更強。

在看別人寫的SQL語句時,會發現有重複命名的CTE,在網上搜了都説在一個SQL中如果CTE重名了會報錯,但是看人家的SQL語句卻運行的好好的,先不説報錯的情況,如果有兩個命名一樣的CTE,那麼在使用這個CTE的時候,到底以哪個為準呢?

直接寫個例子看下吧

先查詢下我的Oracle的版本

select * from product_component_version;

Oracle同名CTE_CTE

WITH 
  my_data AS (
    SELECT 1 AS id FROM dual
  ),
  my_data AS (
    SELECT 2 AS id FROM dual
  )
SELECT * FROM my_data;

執行這個SQL語句,確實不報錯

Oracle同名CTE_CTE_02

查看運行結果,可以發現,如果一個SQL裏面出現重名的CTE,下面使用的地方默認使用的是第一個CTE,而不是第二個

這個SQL不報錯就很奇怪,網上都説同一個 SQL 語句中不能定義多個同名的 CTE(Common Table Expression)如果你嘗試這樣做,Oracle 會報語法錯誤ORA-32035,並且是從Oracle11就開始了

但是我這個是19c的版本,居然不報錯的,就很奇怪???

各位知道為什麼的可以評論區告訴我,大家一起學校成長,加油!