2016-10-13 42 views
0

我正在使用子查詢進行連接操作。當我硬編碼參數,事情工作正常。但是這些參數必須來自我認爲被稱爲相關查詢的外部sql。我想通過它們使用表別名,但這會導致invalid identifier如何在Oracle相關子查詢連接中使用別名?

發明的問題的目的:

SELECT 
    PR.PROVINCE_NAME 
    ,CO.COUNTRY_NAME 
FROM 
    PROVINCE PR 
    JOIN (
     SELECT COUNTRY_ID, COUNTRY_NAME 
     FROM COUNTRY 
     WHERE COUNTRY_ID=PR.COUNTRY_ID 
    ) CO ON CO.COUNTRY_ID=PR.COUNTRY_ID 
WHERE 
    PR.PROVINCE_ID IN (1,2) 

這是鍵入的,所以我希望我沒有出臺任何語法問題在這裏。該問題具體是關於WHERE條款後面的COUNTRY_ID=PR.COUNTRY_ID。這些子查詢中別名是否合法?

+0

好,只要我更換'WHERE COUNTRY_ID = PR.COUNTRY_ID'與'WHERE COUNTRY_ID = 123',事情工作正常。它可能與通過Oracle SQL Developer Version 3.2.09運行此查詢有關嗎? – user6651485

回答

0

您在兩個不同位置使用別名。對於一個它是合法的,對於其它不是:

SELECT pr.province_name, co.country_name 
FROM province pr 
    JOIN (
    SELECT country_id, country_name 
    FROM country 
    WHERE country_id = pr.country_id --<< this reference to the outer table/alias is invalid 
) co ON co.country_id = pr.country_id -- this is valid 
WHERE pr.province_id IN (1,2) 

隨着(標準)加入到派生表中,選擇不能從外部選擇訪問的別名或表。您得到的「無效標識符」是由行WHERE country_id = pr.country_id引起的。

鑑於您的JOIN條件,您可以安全地將其刪除而不更改結果。 Oracle優化器足夠聰明,可以將該條件推送到派生表中。

事實上優化器將重寫查詢到:

SELECT pr.province_name, co.country_name 
FROM province pr 
    JOIN country co ON co.country_id = pr.country_id 
WHERE pr.province_id IN (1,2); 

然而有從在派生表外部查詢訪問表(或別名)的一種方法:它被稱爲一個橫向加入。

這是SQL標準的一部分,但你需要甲骨文12,以便能夠使用它:

以下法律:

SELECT pr.province_name,co.country_name 
FROM province pr 
    JOIN LATERAL (
     SELECT country_id, country_name 
     FROM country 
     WHERE country_id = pr.country_id 
    ) co ON co.country_id = pr.country_id 
WHERE pr.province_id IN (1,2)
+0

好的。那麼這很簡單。我正在使用版本11.2,不接受LATERAL。另外,我爲了這個問題發明了我的例子,並且不能像你所建議的那樣重寫我的查詢。原因是我在該連接中獲得多行,並且suquery將幫助我減少到我需要的單行。感謝您的及時迴應。 – user6651485