2017-08-25 57 views
0

我目前正在使用Oracle SQL開發人員學習SQL。當使用SELECT返回時,父查詢沒有看到子查詢的列*

在編寫查詢時,我想出了三個不同版本的相同查詢。

SELECT 
    sh.share_id 
    FROM shares sh 
    LEFT JOIN trades tr 
     ON sh.share_id = tr.share_id 
    WHERE trade_id is NULL; 

SELECT 
    sr.share_id 
    FROM (SELECT sh.share_id, tr.trade_id 
     FROM shares sh 
    LEFT JOIN trades tr 
     ON sh.share_id = tr.share_id) sr 
    WHERE sr.trade_id is NULL; 

SELECT 
    sr.share_id 
    FROM (SELECT * 
     FROM shares sh 
    LEFT JOIN trades tr 
     ON sh.share_id = tr.share_id) sr 
    WHERE sr.trade_id is NULL; 

前兩個查詢編譯,運行和返回同樣的結果集,但是當我嘗試運行第三個查詢我得到的第三個查詢的第二行一個錯誤。 「SR」。「SHARE_ID」:無效標識符。 我知道*在SELECT語句中選擇所有列,所以爲什麼我會得到這個錯誤?

+0

這兩個表是否有「trade_id」列? –

+0

只有交易表具有「trade_id」列 – Suong

+0

對不起,我不是想要詢問trade_id,但是「share_id」是在兩個表上還是僅在一個表上? –

回答

2

通過閱讀您的意見,在您的最終查詢中,DBMS不知道哪個share_id用於您的SELECT sr.share_id。也就是你的子查詢的SELECT *正在抓取兩列share_id列。你必須做你喜歡的第二個查詢。

+0

哦,我只是注意到,如果我在FROM中運行子查詢,它包括返回表中的share_id和share_id_1,正如您提到的那樣,它會在兩個表中佔用share_id。感謝您的幫助。 – Suong

0

問題是select *正在從兩個表中選擇所有列,即使是那些具有相同名稱的列。所以,你得到share_id兩次。一個簡單的解決辦法是使用USING

SELECT sr.share_id 
FROM (SELECT * 
     FROM shares sh LEFT JOIN 
      trades tr 
      USING (share_id) 
    ) sr 
WHERE sr.trade_id is NULL; 

當然,僅那朵固定參考share_id