SELECT 来自 Oracle table 的 4 个最新行与连接

SELECT 4 latest rows from Oracle table with join

我对 Oracle 很陌生,所以我对 ROWNUM 语句不是很熟悉。我正在尝试从我的 table 获取最新的 4 篇文章。我得到 4 个结果,但它们是 2012 年的文章,即使我的日期排序设置为 DESC。任何帮助都会很棒。

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

只是一个大胆的猜测,但在 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 

这有效,问题是重复的列名

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

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