0

我有书和收件人表。我想按收件人表的成员资格日期列选择最多 20 行的顺序。拿到后,我想按书台的 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

您可以删除一层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()analytic 函数来代替rownum,但这会给您带来更多代码 - 这并不重要,查询的有效性和效率更重要的是它的长度。

于 2013-05-21T14:34:37.383 回答
0

在 oracle 中,您可以根据需要使用 ROW_NUMBER() 函数来减少代码 -

你甚至可以混合你的订单列。

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 回答
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 回答