我们希望能够使用SQL查询选择前N行。目标数据库可以是Oracle或MySQL。有一个优雅的方法吗? (不用说,我们在这里处理排序数据。)
答案 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之间也是如此。我做了一个模拟这种行为的选项:
SELECT columns FROM viewname WHERE PagingHelperID BETWEEN startindex AND stopindex
这将使订购变得困难,您将需要针对您想要检索数据的每个订单的不同视图。
你可以在查询时动态“重写”你的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)
中的这个片段