下面的查询功能完善,它通过查询一个表来查找最近添加的50个用户名,这些用户名是通过一个连续的userid number列添加的。
到目前为止的逻辑是:找出最高的userid;从中减去50;将用户名拉回到更大的地方。
然而,它看起来并不优雅,并且使用了两个子查询来实现它的目标:
SELECT username
FROM table
WHERE userid IN
(SELECT userid
FROM table
WHERE userid >
(SELECT MAX(userid) -50
FROM table))有没有办法减少嵌套?更高效?更优雅?任何帮助都将不胜感激,因为这不是最好的方法!
干杯&非常感谢
阿里
发布于 2009-05-26 10:19:15
所提供的答案都是正确的。您可以使用ROWNUM选择TOP-N样式的结果。
但请注意,rownum是在谓词之后、ORDER BY之前分配给查询结果的。尝试如下所示:
SELECT username
FROM
(SELECT username
FROM table
ORDER BY userid DESC)
WHERE rownum <= 50发布于 2009-05-26 10:14:15
SELECT * FROM (SELECT UserName FROM Table ORDER BY UserID DESC)
WHERE RowNum <= 50..。我想..。自从我摆弄甲骨文以来,已经有一段时间了。
这大致等同于
SQLServer中的SELECT Top 50
和
MySql中的SELECT ... LIMIT 50
发布于 2009-05-26 10:32:21
您可以使用ROW_NUMBER()根据每一行在有序列表中的位置为其分配一个数字。例如,要将以1开头的行编号为最高的userid:
SELECT username
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY user_id DESC) AS RowNr,
*
FROM users
) sub
WHERE RowNr < 50与问题中的查询不同,如果userid不是连续的,这将起作用。
https://stackoverflow.com/questions/909923
复制相似问题