2009-05-25 130 views

Respuesta

16

En las bases de datos que lo apoyan, podría utilizar ROW_NUMBER() para este propósito:

SELECT RowNr 
FROM (
    SELECT 
     ROW_NUMBER() OVER (ORDER BY mycolumn) AS RowNr, 
     mycolumn 
    FROM mytable 
) sub 
WHERE sub.mycolumn = 42 

el ejemplo se supone que estás buscando primaria clave 42 :)

El sub consulta es necesaria porque algo como:

SELECT 
    ROW_NUMBER() OVER (ORDER BY mycolumn) AS RowNr 
FROM mytable 
WHERE sub.mycolumn = 42 

Siempre devolverá 1; ROW_NUMBER() funciona después de WHERE, por así decirlo.

+0

¿Por qué el voto a favor? Esto es correcto y útil para los motores de bases de datos que admiten ROW_NUMBER (qué tan rápido es esto frente a las alternativas, como es habitual, requiere una medición específica en un DB determinado). –

+0

Esta es una solución perfectamente válida para SQL Server. –

+1

No di un voto a la baja, pero el OP no dijo que estaba usando Microsoft SQL Server. Él podría ser, pero él no lo dijo o etiquetó su pregunta por eso. –

0

No hay forma de que pueda ver eso sin seleccionar un subconjunto completo de registros. Si su PK es de tipo entero, puede

select count(*) from mytable 
    where id <= 10 -- Record with ID 10 
    order by mycolumn asc 
+1

que devuelve la posición cuando se ordena por id, la cláusula 'ordenar por' no tiene ningún efecto. – Guffa

2

SQL no funciona de esa manera. Está basado en conjuntos, lo que significa que "posición en esa tabla de resultados" no tiene sentido para la base de datos.

Puede realizar un seguimiento de la posición cuando asigna el ResultSet en una colección de objetos o cuando itera sobre él.

+0

+1 excelente respuesta. SQL Server ya no es * como * dBase, no más "registro + 1" o tal. –

+0

Si la posición no tiene sentido, ¿para qué se usa ORDER BY? ¿O LIMIT, TOP y ROW_NUMBER? – Andomar

+0

LIMIT, TOP y ROW_NUMBER() no son parte del lenguaje SQL estándar. –

15

Se puede contar el número de registros en los que el valor que se está ordenando tiene un valor menor que el registro que se conoce el valor de la clave de:

select count(*) 
from mytable 
where mycolumn < (select mycolumn from mytable where key = 42) 
+2

+1 Simple y no depende de ROW_NUMBER(). Aunque necesitaría agregar 1 al resultado, o chance Andomar

+1

Sí, si desea que la posición se base en una base en lugar de cero. – Guffa

+0

Una condición: este método solo funciona en claves únicas (que sería una PK) –

0

Desgraciadamente no se puede conseguir "la posición de una fila en una mesa ".

Lo mejor que puede obtener, utilizando ORDER BY y una variante de la construcción ROW_NUMBER (depende del motor de base de datos en uso), es la posición de una fila en el conjunto de resultados de la consulta ejecutada.

Sin embargo, esta posición no se correlaciona con ninguna posición de la tabla, a menos que ORDER BY esté en un conjunto de columnas de índice agrupadas, pero incluso esa posición podría invalidarse el siguiente segundo.

Lo que me gustaría saber es para qué pretendía usar esta "posición".

Cuestiones relacionadas