2012-01-05 15 views
6

Rozważmy przykład tabela poniżejJak znaleźć numer wiersza rekordu?

ProductDetailNo ProductDescription 
     224    Apples 
     225    Tomatoes 
     226    Potatoes 

Jak mogę podać numer wiersza dla wybranego wiersza jak poniżej?

RowNo ProductDetailNo   Product Description 
    2   225    Tomatoes 

Korzystanie row_number() w moim zapytaniu prostu zawsze zwraca 1 dla pojedynczego rekordu nie mater co logiczne wiersz w bazie danych.

Dzięki, Damien.

+0

row_number() przyjmuje wyniki zapytania i numery nich. Jeśli zapytanie zawiera tylko jeden wiersz, to numer_wiersza() zawsze będzie wynosił 1. http://msdn.microsoft.com/en-us/library/ms186734.aspx –

+0

Dziękuję za informację Brandona, ale musi być jakiś sposób. –

+0

wyjechał. Dodaj (lub użyj) unikalnego klucza do odpytywanej tabeli i użyj unikalnego klucza, aby wrócić do wyniku. Jeśli ProductDetailNo jest unikatowy, możesz użyć go również jako odnośnika. –

Odpowiedz

10

spróbować

WITH MyTable AS 
(
    SELECT ProductDetailNo, ProductDescription, 
    ROW_NUMBER() OVER (ORDER BY ProductDetailNo) AS 'RowNumber' 
    FROM Product 
) 
SELECT RowNumber, ProductDetailNo  
FROM MyTable 
WHERE ProductDetailNo = 225 
+0

Hej, to nie działa –

+1

spróbuj tego. to zwróci tylko jeden wiersz i będzie zawierał ostatnią kolumnę Rownumber, która pokaże numer jego wiersza w danych –

+0

, jeśli masz błąd, proszę określić –

0

Numer wiersza otrzymasz jest od liczby rzędów wyniku. np. jeśli twój wynik ma tylko jedną krotkę, wiersz nr. zawsze będzie 1.

Aby uzyskać numer wiersza dla całej tabeli, należy dodać dodatkowy atrybut, RowNo z automatycznym przyrostem do tabeli.

Mam nadzieję, że to pomoże, ale prawdopodobnie SQL ma jeszcze lepsze rozwiązanie dla Ciebie!

+0

Dzięki Vinyak nie wiem, na czym polegał downhack, ale tak, mam nadzieję, że trochę magii SQL =) –

2

Co z tym jednym?

SELECT RowNo, ProductDetailNo, ProductDescription 
FROM (SELECT ROW_NUMBER() as RowNo, ProductDetailNo, ProductDescription 
     FROM TheTable) as t 
WHERE ProductDetailNo = 225; 
+0

To jest doskonałe, ale zapytanie wewnętrzne będzie uruchamiane dla wszystkich wierszy w tabeli. Czy masz inne rozwiązanie? –

+1

Cóż, aby policzyć rzeczy, trzeba je wszystkie znać. To najlepsze rozwiązanie dla Twojego pytania, tak jak jest teraz. –

+1

Oczywiście, wartość zwrócona przez 'ROW_NUMBER()' może być różna dla każdego wykonania tego zapytania, biorąc pod uwagę brak "ORDER BY" (czy to jest nawet poprawne?) –

2

Nie ma wpisanego numeru wiersza dla wiersza tabeli. ROW_NUMBER() podaje numer wiersza tylko w określonym zestawie wyników. Więc to jest oczekiwany wynik, który zawsze dostajesz 1, gdy zestaw wyników zawiera tylko 1 rekord. Jeśli potrzebujesz numeru wiersza, twój schemat tabeli powinien zawierać coś w rodzaju automatycznie zwiększanej kolumny IDENTITY.

+1

Hej, Bobby, jest sposób na SQL. –

3

Proszę zaznaczyć to

WITH ArticleSearch AS 
    (
     SELECT 
      ROW_NUMBER() OVER 
       (
        ORDER BY tblProducts.ProductDetailNo          
       ) AS RowNumber, 
      tblProducts.ProductDetailNo, 
      tblProducts.ProductDescription  
     FROM   
      tblProducts 
    ) 

    SELECT 
     a.RowNumber AS SlNo, 
     a.ProductDetailNo, 
     a.ProductDescription 
    FROM 
      ArticleSearch a 
    WHERE 
      a.ProductDetailNo=225 
+0

Hej, wybór wewnętrzny przebiegałby dla wszystkich rekordów? –

2
WITH productCTE 
    AS 
    (SELECT ROW_NUMBER() OVER(ORDER BY ProductDetailNo, ProductDescription) AS RowNo, ProductDetailNo, ProductDescription 
    FROM tbl_Products 
) 
    SELECT * FROM productCTE 
    WHERE RowNo = 2