2017-08-25 1 views
0

現在、Oracle SQL開発者を使用してSQLを学習しています。SELECTを使用して戻るときに親クエリにサブクエリの列が表示されない*

クエリを書きながら、私は同じクエリの3つの異なるバージョンを考え出しました。

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; 

最初の2つのクエリを実行し、コンパイルし、同じ結果セットを返すが、私は第三クエリを実行しようとすると、私は、第三のクエリの2行目にエラーが発生します。 "SR"。 "SHARE_ID":無効な識別子です。 SELECTステートメントの*がすべての列を選択するので、なぜこのエラーが発生するのですか?

+0

両方のテーブルに「trade_id」列がありますか? –

+0

取引テーブルのみが "trade_id"カラムを持っています – Suong

+0

申し訳ありませんが、trade_idについて質問するのは私の意志ではありませんでしたが、 "share_id"は両方のテーブルにあるのでしょうか? –

答えて

2

あなたのコメントを読んでから、DBMSはあなたのSELECT sr.share_idに使用するshare_idを知りません。サブクエリのSELECT *は2つのshare_id列を取得しています。あなたは2番目のクエリのような何かをしなければなりません。

+0

ああ私はちょうど私がFROMでサブクエリを実行する場合、あなたがそれが両方のテーブルのshare_idをつかむと述べたように、返信テーブルのshare_idとshare_id_1を含んでいます。ご協力ありがとうございました。 – Suong

0

select *は、両方のテーブルのすべての列を同じ名前のものであっても選択しているという問題があります。だから、あなたはshare_idを2回受け取ります。簡単な修正は、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への参照を修正TIS。

関連する問題