0

本と受信者テーブルがあります。受信者テーブルのmembershipdate列で最大20行の順序を選択したい。入手したら、book テーブルの id 列で並べ替えたいと思います。私はそのSQLを書きました。より少ないコードでこれを行う方法はありますか?

SELECT  *
FROM    ( SELECT    *
          FROM      ( SELECT    b.*
                      FROM      book b
                                JOIN recipient r ON r.id = b.recipient_id
                      WHERE     b.bookno = 115
                      ORDER BY  r.membershipdate DESC
                    )
          WHERE     ROWNUM <= 20
        )
ORDER BY ID DESC
4

3 に答える 3

3

次の 1 つのレイヤーを削除できますselect

SELECT *
FROM (
    SELECT    b.*
    FROM      book b
    JOIN recipient r ON r.id = b.recipient_id
    WHERE     b.bookno = 115
    ORDER BY  r.membershipdate DESC
)
WHERE ROWNUM <= 20
ORDER BY id DESC;

通常、選択するb.*ことは良い考えではありません。実際にすべての列が必要な場合でも、実際に必要な列を指定して、期待どおりの順序で取得できるようにすることをお勧めします。

row_number()の代わりに分析関数をrownum参照することもできますが、その場合はコードが少し増えます。問題ではなく、クエリの長​​さよりもクエリの有効性と効率の方が重要です。

于 2013-05-21T14:34:37.383 に答える
0

これは機能しませんか?

                  SELECT * FROM
                   (SELECT    b.*
                    FROM      book b
                            JOIN recipient r ON r.id = b.recipient_id
                    WHERE     b.bookno = 115 ORDER BY  r.membershipdate DESC
                   ) WHERE ROWNUM <= 20
                  ORDER BY ID DESC
于 2013-05-21T14:34:29.177 に答える
0

Oracleでは、ROW_NUMBER()関数を使用して、必要に応じてコードを減らすことができます-

Order 列を混在させることもできます。

select * from (
select b.*,row_number() over (order by r.membershipdate desc) cnt
from book b
JOIN recipient r ON r.id = b.recipient_id
WHERE b.bookno = 115
order by cnt,b.id desc
) where cnt<=20;
于 2013-05-21T14:40:20.907 に答える