2013-07-01 32 views
5

Tôi có một bảng TAB có hai lĩnh vực AB, A là một Varchar2(50)B là một Date.nhận được hàng tương ứng với tối đa của hàng khác

Giả sử chúng ta có các giá trị:

A |  B 
------------------ 
a1 | 01-01-2013 
a2 | 05-05-2013 
a3 | 06-06-2013 
a4 | 04-04-2013 

chúng ta cần phải có giá trị của trường A tương ứng đến mức tối đa của lĩnh vực B, đó là có nghĩa là chúng ta cần phải trả lại a3.

tôi đã thực hiện yêu cầu này:

select A 
from TAB 
where 
B = (select max(B) from TAB) 

nhưng tôi muốn tránh lồng nhau chọn như trong giải pháp này.

Bạn có ý tưởng về giải pháp này không?

Cảm ơn bạn

+4

http://stackoverflow.com/questions/13153819/how-to-select-only-row-with-max-sequence-without- sử dụng-a-subquery –

+0

Trong trường hợp bạn đang sử dụng MySQL, tôi đã xây dựng trong câu hỏi này http://stackoverflow.com/questions/17358578/whats-the-canonical-way-to-pull-a-record-from-a -mysql-database-that-have-a-ít nhất là tại sao cách làm của bạn thực sự không tệ. Lưu ý rằng câu trả lời của tôi có đặc biệt cho các nhóm tối đa. Nếu bạn không có nhóm, nó dễ nhất để làm như Manoj đã viết trong câu trả lời của mình. – fancyPants

+0

Bạn đang sử dụng RDBMS nào, ktaria? Nhận xét của tôi ở trên thực sự cũng hợp lệ đối với các RDBMS khác. – fancyPants

Trả lời

2

tôi đã thực hiện một sqlfiddle nơi tôi liệt kê 4 cách khác nhau để đạt được những gì bạn muốn. Lưu ý rằng tôi đã thêm một hàng khác vào ví dụ của bạn. Vì vậy, bạn có hai hàng với ngày tối đa. Xem sự khác biệt giữa các truy vấn? Cách của Manoj sẽ cho bạn một hàng, mặc dù 2 hàng khớp với tiêu chí. Bạn có thể nhấp vào "Xem kế hoạch thực hiện" để xem sự khác biệt cách SQL Server xử lý các truy vấn này.

4 cách khác nhau (bằng văn bản trong SQL chuẩn, họ sẽ làm việc với tất cả các RDBMS):

select A 
from TAB 
where 
B = (select max(B) from TAB); 


select top 1 * from tab order by b desc; 


select 
* 
from 
tab t1 
left join tab t2 on t1.b < t2.b 
where t2.b is null; 


select 
* 
from 
tab t1 
inner join (
    select max(b) as b from tab 
) t2 on t1.b = t2.b; 

và đây hai cách hơn đặc biệt đối với SQL Server nhờ a_horse_with_no_name:

select * 
from (
    select a, 
     b, 
     rank() over (order by b desc) as rnk 
    from tab 
) t 
where rnk = 1; 

select * 
from (
    select a, 
     b, 
     max(b) over() as max_b 
    from tab 
) t 
where b = max_b; 

Xem họ làm việc here.

+0

nó hoạt động tốt với giải pháp thứ tư, cảm ơn bạn rất nhiều – ktaria

+0

Vui mừng khi biết rằng nó hoạt động. Tôi thấy nó kỳ lạ, mặc dù không phải tất cả các giải pháp đều phù hợp với bạn. – fancyPants

+0

Có hai cách khác: http://sqlfiddle.com/#!3/5d8e6/21 –

1

Bạn có thể thử cách này cũng

SELECT TOP 1 A FROM TAB ORDER BY B DESC 

Cảm ơn

Manoj

+0

Manoj, nó không phải là wright như thế này, nó không trả lại giá trị tốt – ktaria

+0

Bạn có chắc chắn, ktaria? Nó chắc chắn sẽ hoạt động. Chỉ giải thích là, rằng cột B của bạn không phải là ngày loại (là nó varchar bởi bất kỳ cơ hội?) Hoặc bạn đã thực hiện một lỗi sao chép và dán. – fancyPants

+0

Vâng, ktaria, điều này sẽ cung cấp cho bạn giá trị thích hợp theo yêu cầu của bạn.Hãy cho tôi biết bạn gặp phải vấn đề gì với điều này? – Manoj

0

này hoạt động tốt cho bạn ... thử nó

SELECT TOP 1 A,B FROM TAB ORDER BY B DESC 
Các vấn đề liên quan