オラクルのサブクエリは外側のブロックから2つのレベルの変数を参照しません。
質問
私は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によって与えられた分析を、使用するソリューションよりも遅くなる可能性がある。
所属していません StackOverflow