Tôi đang gặp khó khăn trong việc chuyển đổi các thủ tục lưu sẵn từ SQL Server sang Oracle để có sản phẩm tương thích với nó.Làm thế nào để sử dụng Oracle ORDER BY và ROWNUM chính xác?
Tôi có thắc mắc mà trả về kỷ lục mới nhất của một số bảng biểu, dựa trên một timestamp:
SQL Server:
SELECT TOP 1 *
FROM RACEWAY_INPUT_LABO
ORDER BY t_stamp DESC
=> Đó là ý chí trả về cho tôi những kỷ lục gần đây nhất
Nhưng Oracle:
SELECT *
FROM raceway_input_labo
WHERE rownum <= 1
ORDER BY t_stamp DESC
=> Điều đó sẽ trả lại cho tôi bản ghi cũ nhất (có thể tùy thuộc vào chỉ mục), bất kể tuyên bố ORDER BY
!
tôi đóng gói truy vấn Oracle cách này để phù hợp với yêu cầu của tôi:
SELECT *
FROM
(SELECT *
FROM raceway_input_labo
ORDER BY t_stamp DESC)
WHERE rownum <= 1
và nó hoạt động. Nhưng nó nghe có vẻ như là một bản hack khủng khiếp với tôi, đặc biệt là nếu tôi có nhiều bản ghi trong các bảng liên quan.
Cách tốt nhất để đạt được điều này là gì?
[On ROWNUM và Hạn chế Kết quả] (http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197. html) –
Điều bạn đã làm trong Truy vấn cuối cùng là chính xác. Bạn chọn hàng đầu tiên của danh sách các bản ghi được sắp xếp. Đơn giản chỉ cần truy vấn đóng gói. – araknoid
Điều này được ghi rõ trong tài liệu hướng dẫn: http://docs.oracle.com/cd/E11882_01/server.112/e26088/pseudocolumns009.htm#i1006297 –