top percent first ejemplos sql sql-server migration

sql - percent - select top access



¿Cómo implementar LIMIT con Microsoft SQL Server? (14)

Tengo esta consulta con mysql:

select * from table1 LIMIT 10,20

¿Cómo puedo hacer esto con Microsoft sql?


A partir de SQL SERVER 2012, puede usar la cláusula OFFSET FETCH:

USE AdventureWorks; GO SELECT SalesOrderID, OrderDate FROM Sales.SalesOrderHeader ORDER BY SalesOrderID OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY; GO

http://msdn.microsoft.com/en-us/library/ms188385(v=sql.110).aspx

Es posible que esto no funcione correctamente cuando el pedido no es único.

Si la consulta se modifica a ORDER BY OrderDate, el conjunto de resultados devuelto no es el esperado.


Al iniciar SQL SERVER 2005, puede hacer esto ...

USE AdventureWorks; GO WITH OrderedOrders AS ( SELECT SalesOrderID, OrderDate, ROW_NUMBER() OVER (ORDER BY OrderDate) AS ''RowNumber'' FROM Sales.SalesOrderHeader ) SELECT * FROM OrderedOrders WHERE RowNumber BETWEEN 10 AND 20;

o algo así para las versiones 2000 y siguientes ...

SELECT TOP 10 * FROM (SELECT TOP 20 FROM Table ORDER BY Id) ORDER BY Id DESC


Así es como limito los resultados en MS SQL Server 2012

SELECT * FROM table1 ORDER BY columnName OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

NOTA: OFFSET solo se puede usar con o en tándem para ORDER BY.

Para explicar la línea de código OFFSET xx ROWS FETCH NEXT yy ROW SOLAMENTE

El "xx" es el número de registro / fila del que desea comenzar a extraer en la tabla.
IE: Si hay 40 registros en la tabla 1. El código de arriba comenzará a tirar desde la fila 10.

El "yy" es la cantidad de registros / filas que desea extraer de la tabla.
Para construir sobre el ejemplo anterior.
IE: Si la tabla 1 tiene 40 registros y comenzaste a tirar desde la fila 10 y tomas el SIGUIENTE conjunto de 10 (aa).
Eso significa que el código anterior extraerá los registros de la tabla 1 comenzando en la fila 10 y terminando en 20. Así, tirando de las filas 10 - 20.

Consulte el enlace para obtener más información sobre OFFSET


Clunky, pero funcionará.

SELECT TOP 10 * FROM table WHERE id NOT IN (SELECT TOP 10 id FROM table ORDER BY id) FROM table ORDER BY id

La omisión de MSSQL de una cláusula LIMIT es criminal, IMO. No deberías tener que hacer este tipo de solución kludgy.


Deberías intentar. En la consulta siguiente, puede ver Agrupar por, ordenar por, Saltar filas y limitar filas.

select emp_no , sum(salary_amount) from emp_salary Group by emp_no ORDER BY emp_no OFFSET 5 ROWS -- Skip first 5 FETCH NEXT 10 ROWS ONLY; -- limit to retrieve next 10 row after skiping rows


En SQL no existe una palabra clave LIMIT. Si solo necesita un número limitado de filas, debe usar una palabra clave TOP que sea similar a un LÍMITE.


Esta es una de las razones por las que trato de evitar el uso de MS Server ... pero de todos modos. A veces simplemente no tienes una opción (¡sí, y tengo que usar una versión obsoleta!).

Mi sugerencia es crear una tabla virtual:

De:

SELECT * FROM table

A:

CREATE VIEW v_table AS SELECT ROW_NUMBER() OVER (ORDER BY table_key) AS row,* FROM table

Entonces solo pregunta:

SELECT * FROM v_table WHERE row BETWEEN 10 AND 20

Si los campos se agregan o eliminan, "fila" se actualiza automáticamente.

El principal problema con esta opción es que ORDER BY es fijo. Entonces, si quieres un orden diferente, deberías crear otra vista.

ACTUALIZAR

Hay otro problema con este enfoque: si intentas filtrar tus datos, no funcionará como se esperaba. Por ejemplo, si lo hace:

SELECT * FROM v_table WHERE field = ''test'' AND row BETWEEN 10 AND 20

WHERE se limita a los datos que están en las filas entre 10 y 20 (en lugar de buscar todo el conjunto de datos y limitar el resultado).


Este es un enfoque de varios pasos que funcionará en SQL2000.

-- Create a temp table to hold the data CREATE TABLE #foo(rowID int identity(1, 1), myOtherColumns) INSERT INTO #foo (myColumns) SELECT myData order By MyCriteria Select * FROM #foo where rowID > 10


Esto es casi un duplicado de una pregunta que hice en octubre: Emular la cláusula LIMIT de MySQL en Microsoft SQL Server 2000

Si está usando Microsoft SQL Server 2000, no hay una buena solución. La mayoría de las personas tiene que recurrir a capturar el resultado de la consulta en una tabla temporal con una clave primaria IDENTITY . A continuación, consulta en contra de la columna de la clave principal usando una condición BETWEEN .

Si está utilizando Microsoft SQL Server 2005 o posterior, tiene una función ROW_NUMBER() , por lo que puede obtener el mismo resultado pero evitar la tabla temporal.

SELECT t1.* FROM ( SELECT ROW_NUMBER OVER(ORDER BY id) AS row, t1.* FROM ( ...original SQL query... ) t1 ) t2 WHERE t2.row BETWEEN @offset+1 AND @offset+@count;

También puede escribir esto como una expresión de tabla común como se muestra en la answer @Leon Tayson.


Si recuerdo correctamente (ha pasado un tiempo desde que me conecté con SQL Server), puede usar algo como esto: (2005 en adelante)

SELECT * ,ROW_NUMBER() OVER(ORDER BY SomeFields) AS [RowNum] FROM SomeTable WHERE RowNum BETWEEN 10 AND 20


Sintácticamente, la consulta de MySQL LIMIT es algo como esto:

SELECT * FROM table LIMIT OFFSET, ROW_COUNT

Esto se puede traducir a Microsoft SQL Server como

SELECT * FROM ( SELECT TOP #{OFFSET+ROW_COUNT} *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum FROM table ) a WHERE rnum > OFFSET

Ahora su consulta select * from table1 LIMIT 10,20 será así:

SELECT * FROM ( SELECT TOP 30 *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum FROM table1 ) a WHERE rnum > 10


SELECT * FROM ( SELECT top 20 -- ($a) number of records to show * FROM ( SELECT top 29 -- ($b) last record position * FROM table -- replace this for table name (i.e. "Customer") ORDER BY 2 ASC ) AS tbl1 ORDER BY 2 DESC ) AS tbl2 ORDER BY 2 ASC; -- Examples: -- Show 5 records from position 5: -- $a = 5; -- $b = (5 + 5) - 1 -- $b = 9; -- Show 10 records from position 4: -- $a = 10; -- $b = (10 + 4) - 1 -- $b = 13; -- To calculate $b: -- $b = ($a + position) - 1 -- For the present exercise we need to: -- Show 20 records from position 10: -- $a = 20; -- $b = (20 + 10) - 1 -- $b = 29;


SELECT * FROM ( SELECT TOP 20 t.*, ROW_NUMBER() OVER (ORDER BY field1) AS rn FROM table1 t ORDER BY field1 ) t WHERE rn > 10