Tại sao truy vấn thứ hai của bạn không hoạt động ...
select Item_No,
Quantity
from Rec_details
group by Item_No,
Quantity
having Quantity=max(Quantity);
Bạn đang nhóm theo cả Item_No
và Quantity
và Item_No
dường như là khóa chính và chứa các giá trị duy nhất nên mỗi nhóm sẽ chỉ chứa một hàng. HAVING
mệnh đề này nằm trong nhóm nên nó sẽ kiểm tra xem giá trị của quantity
là giá trị lớn nhất trong nhóm đó nhưng chỉ có một giá trị trong nhóm nên điều này sẽ luôn đúng. Truy vấn của bạn tương đương với:
SELECT DISTINCT
Item_No,
Quantity
FROM Rec_details;
Một số cách khác để nhận giá trị lớn nhất:
Thiết lập lược đồ Oracle 11g R2 :
create table Rec_details (item_no, Quantity ) AS
SELECT 12507,1 FROM DUAL UNION ALL
SELECT 12549,4 FROM DUAL UNION ALL
SELECT 12100,8 FROM DUAL UNION ALL
SELECT 12501,2 FROM DUAL UNION ALL
SELECT 12201,7 FROM DUAL UNION ALL
SELECT 12509,3 FROM DUAL UNION ALL
SELECT 12080,1 FROM DUAL;
Truy vấn 1 - Nhận một hàng với số lượng quantity
và item_no
mới nhất (sử dụng 1 lần quét bảng) :
SELECT MAX( item_no ) KEEP ( DENSE_RANK LAST ORDER BY Quantity ) AS Item_no,
MAX( Quantity ) AS Quantity
FROM Rec_Details
Kết quả :
| ITEM_NO | QUANTITY |
|---------|----------|
| 12100 | 8 |
Truy vấn 2 - Nhận một hàng với số lượng quantity
và item_no
mới nhất (sử dụng 1 lần quét bảng) :
SELECT *
FROM (
SELECT *
FROM Rec_details
ORDER BY Quantity DESC, Item_no DESC
)
WHERE ROWNUM = 1
Kết quả :
| ITEM_NO | QUANTITY |
|---------|----------|
| 12100 | 8 |
Truy vấn 3 - Nhận tất cả các hàng với số lượng quantity
(sử dụng 1 lần quét bảng) :
SELECT Item_no, Quantity
FROM (
SELECT r.*,
RANK() OVER ( ORDER BY Quantity DESC ) AS rnk
FROM Rec_details r
)
WHERE rnk = 1
Kết quả :
| ITEM_NO | QUANTITY |
|---------|----------|
| 12100 | 8 |
Truy vấn 4 - Nhận tất cả các hàng với số lượng quantity
(sử dụng 2 lần quét bảng) :
SELECT Item_no,
Quantity
FROM Rec_Details
WHERE Quantity = ( SELECT MAX( Quantity ) FROM Rec_Details )
Kết quả :
| ITEM_NO | QUANTITY |
|---------|----------|
| 12100 | 8 |