Sql 使用join从Oracle表中选择4个最新的行
我是Oracle的新手,所以我对ROWNUM语句并不完全熟悉。我正试图从我的表格中获取最新的4篇文章。我得到了4个结果,但它们都是2012年的文章,即使我的日期顺序设置为DESC。任何帮助都会很好 Oracle查询: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
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