使用join从Oracle表中选择4个最新行

时间:2015-02-02 13:04:29

标签: sql oracle date join rownum

我对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

3 个答案:

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