2009-07-03 40 views
6

tôi có một truy vấn sql:Làm thế nào để xác định vị trí của hàng trong tập kết quả sql?

select id, name from table order by name 

kết quả trông như thế này:

52 arnold 
33 berta 
34 chris 
47 doris 
52 emil 

cho một id cho = 47 làm thế nào tôi có thể xác định vị trí trong kết quả thiết lập? kết quả nên được 4 vì:

52 arnold 
33 berta 
34 chris 

là trước (47 tuổi, Doris) và id = 41 là vào vị trí thứ 4 trong tập kết quả.

Cách thực hiện việc này trong SQL? Làm thế nào trong HQL? Trong ví dụ về phân trang, tôi có phải thực hiện 2 câu lệnh hoặc có giải pháp mà tôi có thể truy xuất chính xác cửa sổ có chứa hàng có id = 47 không?

PostgreSQL và java

Trả lời

10

Các bài đăng trước là chính xác. Sử dụng ROW_NUMBER nếu sử dụng Microsoft SQL Server 2005 hoặc cao hơn.

Tuy nhiên, thẻ của bạn không chỉ định rằng bạn đang sử dụng MSSQL, vì vậy đây là giải pháp sẽ hoạt động trên hầu hết các triển khai RDBMS. Về cơ bản, sử dụng truy vấn con tương quan để xác định số lượng hàng trong cùng một tập hợp nhỏ hơn hàng hiện tại, dựa trên các giá trị của mệnh đề ORDER của truy vấn bên ngoài. Một cái gì đó như thế này:

SELECT  T1.id, 
      T1.[name], 
      (SELECT COUNT(*) 
      FROM table T2 
      WHERE T2.[name] < T1.[name]) + 1 AS rowpos 
FROM  table T1 
ORDER BY T1.[name] 
+0

làm thế nào để bạn đối phó với một tie? – brad

+0

Tôi đoán rằng nó phụ thuộc vào những gì bạn muốn sử dụng để phá vỡ cà vạt.Bạn có thể thêm crieria bổ sung vào truy vấn phụ để phân biệt thêm tính toán 'rowpos' để không có mối quan hệ nào được tạo ra, hoặc thêm mệnh đề thứ tự bổ sung vào truy vấn bên ngoài để ngắt tie. –

+1

Trường hợp này có nhanh hơn giải pháp ROW_NUMBER ngay cả khi DB của bạn cung cấp ROW_NUMBER không? Tôi giả sử theo cách này là O (n) so với O (n * log (n)) (nhận được số hàng) – Flati

2

Giả SQL 2005, bạn có thể sử dụng Row_Number

3

Bạn không đề cập đến mà RDBMS bạn đang chạy, nhưng nếu bạn đang sử dụng SQL Server 2005 hoặc cao hơn, bạn có thể sử dụng các ROW_NUMBER() chức năng - như thế này:

SELECT id, name, ROW_NUMBER() OVER (ORDER BY name) AS RowNumber 
FROM MyTable 

Sau đó, để lấy một hàng nhất định, bạn có thể sử dụng một bảng có nguồn gốc hoặc một biểu thức bảng chung - như thế này:

;WITH NumberedRows 
AS 
(SELECT id, name, ROW_NUMBER() OVER (ORDER BY name) AS RowNumber 
FROM MyTable) 
SELECT RowNumber FROM NumberedRows WHERE id = 47 

Để sắp xếp "trang nào" bản ghi được bật, bạn sẽ cần phải chia số hàng theo số lượng bản ghi trên mỗi trang và làm tròn số nguyên gần nhất.

1

Câu trả lời tùy thuộc vào phiên bản SQL bạn đang sử dụng.

Nếu bạn đang sử dụng MSSQL 2005, bạn có thể sử dụng hàm phân tích mới ROW_NUMBER() để tạo số thứ tự theo thứ tự mà chúng tôi xác định theo thứ tự theo mệnh đề. Cú pháp của ROW_NUMBER() chức năng là:

ROW_NUMBER() OVER (ORDER BY)

hoặc

ROW_NUMBER() OVER (PARTITION BY)

Nếu bạn đang sử dụng một phiên bản cũ của SQL Server bạn có thể tạo một bảng tạm thời với một cột nhận dạng và chọn kết quả từ đó.

1

sử dụng Row_Number

Các vấn đề liên quan