28

投稿とその投稿に関連付けられた最初のコメントを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  

そしてそれはうまくいきます。

ただし、OracleでエラーORA-00904 p.post_id:無効な識別子が発生します。

1つの副選択では問題なく機能するようですが、rownum(Oracleでは制限/オフセットなし)を使用する必要があるため、1つだけではコメントを取得できません。

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

4

2 に答える 2

50

いいえ、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
于 2010-01-12T10:43:02.323 に答える
3

プラットフォームに依存しない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が提供する分析を使用するソリューションよりも低速になる可能性があります。

于 2010-01-12T15:18:58.023 に答える