2009-05-05 66 views

回答

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

否。语法不同。

你可以,但是,创建视图:

/* 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

由于被迫定购视图(至少在使用TOP n子句的SQL服务器上)的限制。 – Tomalak 2009-05-05 13:52:40

+1

和其他DBMS支持这个概念,但使用其他符号。 – 2009-05-05 13:59:30

+0

另外,某些DBMS不允许在视图中使用ORDER BY子句。 – 2009-05-05 14:00:07

1

我不认为这是可能的,即使只是MySQL和MSSQL之间。我做了一个模拟此类行为的选项:

  1. 创建具有自动递增int列的视图;说“PagingHelperID”
  2. 喜欢写查询:SELECT columns FROM viewname WHERE PagingHelperID BETWEEN startindex AND stopindex

这将使订货困难,你将需要为每个在你打算中检索数据的顺序不同的看法。

根据数据库查询时,您也可以随时“重写”您的sql,并为重写器定义自己的方法,但我认为没有任何“好”的方法来执行此操作。

1

如果桌子上有一个独特的密钥......

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

您可以用自己的标准,如果你想在“顶部”的定义是基于一些其他的逻辑不是唯一的关键...

编辑:如果定义“顶部”的含义的“排序”是基于一个非唯一的列或一组列,那么你仍然可以使用这个,但你不能保证你将能够得到正好N个记录...

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

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

注:由于这涉及到相关子查询时,性能可以是非常大的表的问题...

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

相关问题