オラクルのサブクエリは外側のブロックから2つのレベルの変数を参照しません。

StackOverflow https://stackoverflow.com/questions/2048244

  •  20-09-2019
  •  | 
  •  

質問

私は1つのクエリでのポスト、ポストに関連付けられている最初のコメントを取得したいのですが。ここで私は、PostgreSQLでそれを行う方法です。

SELECT p.post_id, 
(select * from 
 (select comment_body from comments where post_id = p.post_id 
 order by created_date asc) where rownum=1
) the_first_comment
FROM posts p  

とそれが正常に動作します。

しかし、オラクルに私はエラーを取得していますORA-00904 p.post_id:無効な識別子

1つの副選択のために正常に動作するようですが、私は唯一の原因私はROWNUM(制限なし/オラクルのオフセット)を使用する必要があるという事実にしてコメントを得ることができません。

私はここで間違って何をしているのですか?

役に立ちましたか?

解決

いいえ、サブクエリを相関していないOracleは深い複数のレベルを入れ子になった(ともないんMySQL)。

これは、よく知られた問題である。

これを使用します:

SELECT  p.post_id, c.*
FROM    posts
JOIN    (
        SELECT  c.*, ROW_NUMBER() OVER (PARTITION BY post_id ORDER BY created_date ASC) AS rn
        FROM    comments c
        ) c
ON      c.post_id = p.post_id
        AND rn = 1

他のヒント

あなたは、プラットフォームに依存しないでSQLが必要な場合、これは動作します:

SELECT p.post_id
     , c.comment_body
  FROM posts p
     , comments c
 WHERE p.post_id = c.post_id
   AND c.created_date IN
       ( SELECT MIN(c2.created_date)
           FROM comments c2
          WHERE c2.post_id = p.post_id
        );

しかし、それは(post_idの、created_date)は、コメントの主キーであることを前提としています。そうでない場合は、同じcreated_dateとのコメントが複数行の記事を取得するつもりだ。

また、それはQuassnoiによって与えられた分析を、使用するソリューションよりも遅くなる可能性がある。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top