可以有一个与数据库无关的SQL查询来获取前N行吗?

时间:2009-05-05 13:49:14

标签: mysql database oracle database-agnostic

我们希望能够使用SQL查询选择前N行。目标数据库可以是Oracle或MySQL。有一个优雅的方法吗? (不用说,我们在这里处理排序数据。)

6 个答案:

答案 0 :(得分:2)

没有。语法不同。

但是,您可以创建视图:

/* Oracle */

CREATE VIEW v_table
AS
SELECT  *
FROM    (
        SELECT  *
        FROM    table
        ORDER BY
                column
        )
WHERE   rownum <= n

/* MySQL */

CREATE VIEW v_table
AS
SELECT  *
FROM    table
ORDER BY
        column
LIMIT   n

答案 1 :(得分:2)

从这张桌子中获得前5名得分手:

CREATE TABLE people
             (id      int, 
              name    string, 
              score   int)

试试这个SQL:

SELECT id, 
       name, 
       score
FROM   people  p
WHERE  (SELECT COUNT(*) 
        FROM   people p2
        WHERE  p2.score  > p.score 
       ) <=4 

我相信这应该适用于大多数地方。

答案 2 :(得分:1)

我认为即使只是在mysql和mssql之间也是如此。我做了一个模拟这种行为的选项:

  1. 创建具有自动递增的int列的视图;说'PagingHelperID'
  2. 编写类似:SELECT columns FROM viewname WHERE PagingHelperID BETWEEN startindex AND stopindex
  3. 的查询

    这将使订购变得困难,您将需要针对您想要检索数据的每个订单的不同视图。

    你可以在查询时动态“重写”你的sql,具体取决于数据库并为重写器定义你自己的方法,但我认为没有任何“好”方法可以做到这一点。

答案 3 :(得分:1)

如果桌子上有唯一的钥匙,是......

Select * From Table O
Where (Select Count(*) From Table I
       Where [UniqueKeyValue] < O.UniqueKeyValue)  < N

如果您希望“Top”定义基于其他逻辑而不是唯一键,则可以替换自己的标准...

编辑:如果定义“顶部”含义的“排序”基于非唯一列或列集,那么您仍然可以使用它,但不能保证您将能够准确地得到N个记录...

  Select * From Table O
  Where (Select Count(*) From Table I
         Where nonUniqueCol < O.nonUniqueCol) < 10

如果记录8,9,10,11和12在[nonUniqueCol]中都具有相同的值,则查询将仅生成7条记录(使用“&lt;”)...或12(如果你使用'&lt; =')

注意:由于这涉及相关的子查询,因此对于非常大的表来说,性能可能是一个问题......

答案 4 :(得分:0)

我认为每个产品都遵循不同的语法来实现这一目标。请在下面找到类似的问题。 Is there an ANSI SQL alternative to the MYSQL LIMIT keyword?

答案 5 :(得分:0)

看完这个问题后,最大的问题是MySQL不符合ISO SQL:2003标准。如果是,您将拥有这些方便的窗口功能:

SELECT * from
(   SELECT
    RANK() OVER (ORDER BY <blah>) AS ranking,
    <rest of columns here>,
    FROM <table>
)
WHERE ranking <= <N>

唉,MySQL(和其他模仿它的行为的人,例如SQLite)没有,因此是完整的限制问题。

查看维基百科(http://en.wikipedia.org/wiki/Window_function_(SQL)#Limiting_result_rows

中的这个片段