2010-10-19 35 views
5

Cách chúng tôi có thể chọn dấu lớn thứ hai hoặc bất kỳ thứ gì từ một bảng mà không sử dụng LIMIT? Tôi biết có thể sử dụng LIMIT, nhưng có thể sử dụng nó không?Chọn lớn thứ hai từ một bảng không giới hạn

Giả sử chúng tôi có các cột id và điểm đánh dấu.

+2

Bạn không thích gì về LIMIT? – Unreason

+0

đó là một câu hỏi phỏng vấn;) – viMaL

+0

Tôi nghĩ câu hỏi có thể là giải quyết nó mà không cần sử dụng ORDER BY và LIMIT. kể từ khi yêu cầu sắp xếp trong O (n * log (n)), trong khi người phỏng vấn đang tìm O (n) – dharm0us

Trả lời

7

Nhãn giả định là duy nhất, truy vấn sau cung cấp cho bạn dấu lớn thứ hai.

SELECT MAX(marks) 
FROM  ATable 
WHERE marks < (SELECT MAX(marks) FROM ATable) 

Để có được toàn bộ hồ sơ, bạn có thể bọc này trong một INNER JOIN

SELECT t1.* 
FROM ATable t1 
     INNER JOIN (
      SELECT marks = MAX(marks) 
      FROM  ATable 
      WHERE marks < (SELECT MAX(marks) FROM ATable) 
     ) t2 ON t2. marks = t1.marks 
+0

Đối với MySql: select * from atable where marks = (chọn max (marks) là secmax từ atable (chọn tối đa (đánh dấu) từ có thể)) – dharm0us

+0

là '(SELECT MAX (marks) FROM ATable)' nhận được tiền mặt hoặc truy vấn này chạy cho mỗi dòng? vì cách tiếp cận này rất chậm trên một bảng với khoảng 1000 hàng, nhờ –

+1

@Gabriel - lưu ý rằng truy vấn chỉ trả về một hàng duy nhất. Trên một bảng được lập chỉ mục thích hợp, điều này dẫn đến việc quét chỉ mục và một chỉ mục tìm kiếm. Đây không phải là vấn đề đối với bất kỳ công cụ cơ sở dữ liệu nào đáng giá muối của nó. –

1
select max(number), id 
from <tableName> 
where number < (select max(number) from <tableName>) 
0

Bạn có thể làm một

SELECT MAX(marks) FROM TABLE 
WHERE marks NOT IN (SELECT MAX(marks) FROM TABLE) 

nhưng LIMIT nên thực hiện tốt hơn sau đó ở trên, vì vậy câu hỏi là tại sao bạn không thích nó?

0

Nếu bạn cần toàn bộ hàng (tất cả các cột), điều này sẽ làm điều đó. Ngoài ra, nó sẽ luôn trả về chỉ một hàng, ngay cả khi có một số có cùng giá trị lớn nhất thứ 2.

Select top 1 * 
    From (Select Top 2 * 
      From TABLE 
     Order By marks desc 
     ) a 
Order By marks asc 

Nếu bạn muốn chỉ có một hàng với giá trị tối đa 2 sản, bạn nên sử dụng:

select Top 1 * 
    from TABLE 
where marks < (select max(marks) from TABLE) 
Order by max desc 

Nó có thể được thực hiện bằng cách CTE (SQL Server 2005 +) quá:

;With a as 
(
Select Dense_Rank() over (order by marks desc) as nRank, 
     * 
    From TABLE 
) 
Select Top 1 * 
    from a 
Where nRank=2 

Nếu bạn muốn xem tất cả các hàng có dấu tối đa thứ 2, chỉ cần xóa TOP 1 khỏi truy vấn trước đó.

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