我对Oracle很陌生,所以我对ROWNUM
语句并不完全熟悉。我想从我的桌子上得到最新的4篇文章。虽然我的日期排序设置为DESC
,但我得到了4个结果,但它们是2012年的文章。任何帮助都会很棒。
Oracle查询:
SELECT bt.article_id, ba.*
FROM articles_types bt
LEFT JOIN blog_articles ba
ON ba.article_id = bt.article_id
WHERE ROWNUM < 5
ORDER BY Published DESC
答案 0 :(得分:4)
只是一个疯狂的猜测,但在rownum限制之前订购结果:
select t.* from
(
SELECT *
FROM articles_types bt
LEFT JOIN blog_articles ba
ON ba.article_id = bt.article_id
ORDER BY Published DESC
) T
WHERE ROWNUM <= 4
这很有效,问题是重复的列名
答案 1 :(得分:2)
在where
子句之前评估order by
子句。所以这里发生的是你选择数据库返回的前四行(完全按任意顺序),然后按Published
的降序排序。
一种解决方案可能是将where
子句移动到外部查询:
SELECT *
FROM (SELECT bt.article_id, ba.*
FROM articles_types bt
LEFT JOIN blog_articles ba ON ba.article_id = bt.article_id
ORDER BY Published DESC)
WHERE ROWNUM < 5
替代方案,在Oracle 12c中,您可以(最终!)使用fetch first
子句:
SELECT bt.article_id, ba.*
FROM articles_types bt
LEFT JOIN blog_articles ba ON ba.article_id = bt.article_id
ORDER BY Published DESC
FETCH FIRST 4 ROWS ONLY
答案 2 :(得分:1)
rownum
函数在order by
之前应用,因此它会选择它找到的前4个无序记录。
要获得rownum
所需的结果,您必须将此查询转换为子查询,并在外部查询中应用rownum
。
SELECT *
FROM
(SELECT
bt.article_id, ba.*
FROM
articles_types bt
LEFT JOIN
blog_articles ba
ON
ba.article_id = bt.article_id
ORDER BY
Published DESC)
WHERE rownum < 5