Saturday, July 18, 2009

Seleccionar fila n de una tabla de SQL Server

En este post les mostraré varias alternativas con las que podrémos consultar una columna "n" de una tabla, por ejemplo, consultar la columna 5 en una tabla.
Hay que tomar en cuenta que, en caso de traernos una fila de una tabla muy pesada, por decir, la fila 5,124,244 puede traernos serios problemas de desempeño. Así que considera utilizar planes de ejecución para probar los métodos en Resultsets muy pesados y ver cuál te funciona mejor.

El primer paso es crear la tabla de ejemplo:

CREATE TABLE Names
(
NameID INT IDENTITY(1, 1)
PRIMARY KEY CLUSTERED,
FName VARCHAR(32)
)
GO

SET NOCOUNT ON
INSERT Names(FName) VALUES('Aaron')
INSERT Names(FName) VALUES('Greg')
INSERT Names(FName) VALUES('Alex')
INSERT Names(FName) VALUES('Luan')
INSERT Names(FName) VALUES('John')
INSERT Names(FName) VALUES('Todd')
INSERT Names(FName) VALUES('Scott')
INSERT Names(FName) VALUES('Jess')
INSERT Names(FName) VALUES('Drew')
INSERT Names(FName) VALUES('Katherine')
INSERT Names(FName) VALUES('Paul')
GO

Alternativa 1: TOP anidados

SELECT TOP 1 FName
FROM
(
SELECT TOP 10 FName
FROM Names
ORDER BY FName
) sub
ORDER BY FName DESC

Alternativa 2: NOT IN
 
SELECT TOP 1 FName
FROM Names WHERE FName NOT IN
(
SELECT TOP 9 FName
FROM Names
ORDER BY FName
)
ORDER BY FName

Alternativa 3: "count derivado" se asume que FName is único

SELECT FName
FROM Names
WHERE
(
SELECT COUNT(*)
FROM Names n2
WHERE n2.FName <= Names.FName ) = 10

Alternativa 4: MAX

SELECT FName = MAX(FName) FROM
(
SELECT TOP 10 FName
FROM Names
ORDER BY FName
) sub

Alternativa 5: Uso de cursores

DECLARE FNames CURSOR
LOCAL STATIC READ_ONLY FOR
SELECT FName
FROM Names
ORDER BY FName

DECLARE @FName VARCHAR(32)

OPEN FNames

FETCH RELATIVE 10 FROM FNames INTO @FName

CLOSE FNames
DEALLOCATE FNames

SELECT FName = @FName

DROP TABLE Names
GO

Referencia

No comments:

Post a Comment