2012-09-18 56 views
5

Giả sử chúng tôi muốn lấy bản ghi đầu tiên 1 của kết quả. Có cách nào thanh lịch hơn để làm điều đó không?Oracle: Một cách thanh lịch để lấy bản ghi đầu tiên (truy vấn hàng đầu)

WITH temp 
     AS ( SELECT WKFC_CRONOLOGIA_ID 
       FROM SIUWKF.WKF_CRONOLOGIA c 
       WHERE  Ogg_oggetto_id = vOGG_ID 
        AND TOG_TIPO_OGGETTO_ID = vTOG 
        AND C.WKFC_DATA_FIN = TO_DATE ('31/12/9999', 'DD/MM/YYYY') 
        AND Wkfc_Tipo = 'STATO' 
      ORDER BY WKFC_DATA_INI DESC) 
    SELECT WKFC_CRONOLOGIA_ID 
    INTO vCRONOLOGIA_ID 
    FROM temp 
    WHERE ROWNUM = 1; 
+5

Tôi không nghĩ có bất kỳ cách thanh lịch khác để làm điều đó. Có thể có những cách khác để làm điều đó, nhưng những người đó sẽ không nhất thiết phải thanh lịch. – Annjawn

+0

Cách nào khác để xây dựng truy vấn top-k? – Revious

+1

bạn đang cố gắng tránh những gì bạn có? hoặc những gì ...... về truy vấn hiện tại là "không thanh lịch"? http://stackoverflow.com/questions/3451534/how-to-do-top-1-in-oracle –

Trả lời

1

Tôi nghĩ giải pháp của bạn là không sao. Giải pháp duy nhất khác với Oracle là sử dụng hàm phân tích row_number() nhưng điều này làm cho nó kém thanh lịch hơn. Cơ sở dữ liệu khác có tuyên bố TOP 1 nhưng không có Oracle nào khác tương đương với ROWNUM bên ngoài truy vấn phụ khi bạn sử dụng ORDER BY. Tôi đồng ý sử dụng WITH làm cho nó dễ đọc hơn. Sau đây có thể được viết nhanh hơn nhưng tôi không chắc chắn nếu nó là thanh lịch hơn. Có thể là vấn đề về hương vị:

SELECT * FROM 
( SELECT WKFC_CRONOLOGIA_ID 
       FROM SIUWKF.WKF_CRONOLOGIA c 
       WHERE  Ogg_oggetto_id = vOGG_ID 
        AND TOG_TIPO_OGGETTO_ID = vTOG 
        AND C.WKFC_DATA_FIN = TO_DATE ('31/12/9999', 'DD/MM/YYYY') 
        AND Wkfc_Tipo = 'STATO' 
      ORDER BY WKFC_DATA_INI DESC) 
WHERE ROWNUM = 1 

Đây là những gì Oracle SQL hướng dẫn sử dụng nói về ROWNUM và báo cáo đầu N và xác nhận cách thực hiện.

enter image description here

Nguồn Oracle® Database SQL Language Reference 11g Release 2 (11.2) E26088-01

+0

Làm thế nào bạn có thể viết lại bằng chức năng phân tích? – Revious

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