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

Sql 使用join从Oracle表中选择4个最新的行,sql,oracle,date,join,rownum,Sql,Oracle,Date,Join,Rownum,我是Oracle的新手,所以我对ROWNUM语句并不完全熟悉。我正试图从我的表格中获取最新的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

我是Oracle的新手,所以我对ROWNUM语句并不完全熟悉。我正试图从我的表格中获取最新的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 limit之前排序结果:

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 
这样做成功了,问题是列名重复

在order by之前应用rownum函数,因此它会选择找到的前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子句之前求值。这里发生的事情是,您以完全任意的顺序选择数据库返回的前四行,然后按发布的降序对它们进行排序

一种解决方案是将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 developer中遇到了以下错误:ORA-00918:列定义不明确00918。00000-列定义不明确*原因:*操作:第1行的错误列:8@huddds-您将从两个表中获取文章id;你应该从ba中指定你想要的列,而不是使用*这通常是一个好主意,并且省去重复的部分。谢谢,我会记下这一点,仍然使用oracleI。我尝试过这一点,并得到以下错误:ORA-00918:列定义模糊00918。00000-列定义不明确*原因:*操作:第1行的错误列:8您的两个表似乎都有一个名为article_id的列,并且您正在将它们与子查询一起拉入,因此存在歧义。您可以列出ba表中要减去article_id的所有列,也可以不在子查询中选择bt.article_id列。在传统的Oracle SQL语句中,首先解析引用Rownum的Where子句,然后才解析Order By,这会导致错误的结果。这是一个很好的语法示例,看起来不错,如果有更多的人来解析它,它将被正确解析,但是计算机首先执行所有Where子句,忽略实际上依赖于输出本身的伪列函数,因为Order By更改了输出。您还必须知道,任何没有Order By的语句都没有任何逻辑顺序。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