2009-05-25 12 views

Odpowiedz

16

na bazach danych, które go obsługują, można użyć ROW_NUMBER() do tego celu:

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

Przykład zakłada szukasz podstawowy element 42 :)

podzapytania jest konieczne, ponieważ coś na przykład:

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

Zawsze zwróci 1; ROW_NUMBER() działa po WHERE, że tak powiem.

+0

Dlaczego spadamy? Jest to poprawne i pomocne dla silników baz danych obsługujących ROW_NUMBER (jak szybkie jest to w porównaniu z alternatywnymi, jak zwykle, wymaga określonego pomiaru na danym DB). –

+0

To jest całkowicie poprawne rozwiązanie dla SQL Server. –

+1

Nie oddałem żadnej opinii, ale fakw OP nie powiedział, że używa Microsoft SQL Server. Być może, ale nie powiedział tego ani nie oznaczył jego pytania. –

0

Nie można tego stwierdzić bez wybrania całego podzbioru rekordów. Jeśli twój PK jest typu całkowitego, możesz

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

Zwraca pozycję, gdy jest sortowane przez id, klauzula "order by" nie ma żadnego efektu. – Guffa

2

SQL nie działa w ten sposób. Jest oparty na ustawieniach, co oznacza, że ​​"pozycja w tabeli wyników" nie ma znaczenia dla bazy danych.

Możesz śledzić położenie, gdy mapujesz ResultSet do kolekcji obiektów lub gdy ją sprawdzasz.

+0

+1 doskonała odpowiedź. Serwer SQL jest * NIE * jak już dBase - nie ma więcej "rekord + 1" lub coś takiego. –

+0

Jeśli pozycja jest bez znaczenia, do czego służy ORDER BY? Lub LIMIT, TOP i ROW_NUMBER? – Andomar

+0

LIMIT, TOP i ROW_NUMBER() nie są częścią standardowego języka SQL. –

15

można policzyć liczbę rekordów, w których wartość, że jesteś sortowanie ma mniejszą wartość niż zapis, że znasz kluczową wartość:

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

+1 Prosty i nie zależy od ROW_NUMBER(). Chociaż musisz dodać 1 do wyniku lub przypadek Andomar

+1

Tak, jeśli chcesz, aby pozycja była oparta na jednym, zamiast na zera. – Guffa

+0

Jedno zastrzeżenie: ta metoda działa tylko na unikatowych kluczach (które byłyby PK) –

0

Niestety nie można uzyskać „pozycję wiersz w tabeli ".

Najlepsze, co można uzyskać, używając ORDER BY i wariantu konstruktora ROW_NUMBER (w zależności od używanego silnika bazy danych), to pozycja wiersza w zestawie wynikowym wykonanego zapytania.

Ta pozycja nie odwzorowuje z powrotem do żadnej pozycji w tabeli, chyba że ORDER BY znajduje się w zestawie klastrowanych kolumn indeksu, ale nawet wtedy ta pozycja może zostać unieważniona w następnej sekundzie.

To, co chciałbym wiedzieć, to, do czego zamierzałeś użyć tej "pozycji".

Powiązane problemy