更优雅的SQL?

时间:2009-05-26 10:09:29

标签: sql database oracle

以下查询功能完备,查询单个表以查找通过顺序userid数字列添加的最后50个用户名。

到目前为止的逻辑是:找出最高的用户ID;从中减去50;将用户名拉回到更大的位置。

然而,它看起来并不优雅,并使用两个子查询来实现它的目标:

SELECT username  
FROM table  
WHERE userid IN  
  (SELECT userid  
   FROM table  
   WHERE userid >  
    (SELECT MAX(userid) -50  
     FROM table))

有没有办法让它更少嵌套?更高效?更优雅?任何帮助将不胜感激,因为这不是最好的方式!

干杯&非常感谢 阿里

7 个答案:

答案 0 :(得分:6)

提供的答案是正确的。 您可以使用ROWNUM选择TOP-N样式结果。

请注意,请注意在预测之后但在ORDER BY之前将rownum分配给查询结果。尝试以下内容:

SELECT username  
FROM 
  (SELECT username  
   FROM table  
   ORDER BY userid DESC)
WHERE rownum <= 50

答案 1 :(得分:2)

SELECT * FROM (SELECT UserName FROM Table ORDER BY UserID DESC) 
WHERE RowNum <= 50

......我想......自从我摆弄甲骨文以来已经有一段时间了。

这与

大致相同 SQL Server中的

SELECT Top 50

MySql中的

SELECT ... LIMIT 50

答案 2 :(得分:2)

您可以使用ROW_NUMBER()根据其在有序列表中的位置为每一行分配一个数字。例如,要为最高用户标识的行开头编号:

SELECT username
FROM (
    SELECT 
         ROW_NUMBER() OVER (ORDER BY user_id DESC) AS RowNr,
         *
    FROM users
) sub
WHERE RowNr < 50

与问题中的查询不同,如果userid不连续,这将有效。

答案 3 :(得分:1)

纯粹为了审美,我使用SQLinForm这是一个Java applet,可以很好地格式化你的SQL。它也很灵活,有很多选项。

答案 4 :(得分:0)

取决于您使用的数据库,但请尝试以下方法:

预言: 从表中选择用户名rownum&lt; 50用户订单;

的PostgreSQL: 通过userid limit 10;

从表顺序中选择用户名

答案 5 :(得分:0)

怎么样:

SELECT username FROM table ORDER BY userid DESC LIMIT 50

答案 6 :(得分:0)

如果您在用户表中有一个DateCreated字段,则可以进行如下查询:

SELECT TOP 50 username
FROM table 
ORDER BY DateCreated DESC