TEMP_TABLE thiếu khóa chính tuần tự hoặc bất kỳ chỉ báo nào khác cho thứ tự chèn. Vì vậy, không thể lấy ID mới nhất cho LOAD bằng chính các cột của bảng.
Tuy nhiên, có một tùy chọn: ORA_ROWSCN () . Đây là cột giả xác định Số thay đổi hệ thống cho giao dịch đã thay đổi bảng. Vì vậy, chúng tôi có thể xây dựng lại thứ tự chèn bằng cách sắp xếp bảng trên ORA_ROWSCN.
Có một số lưu ý:
- Theo mặc định, SCN áp dụng cho cấp khối. Do đó, tất cả các hàng trong một khối có cùng một SCN. Đó là một ước lượng đủ tốt cho các bảng rộng nhưng vô vọng đối với đồ chơi hai cột như TEMP_TABLE. Chúng tôi có thể theo dõi SCN ở cấp hàng nhưng chỉ khi bảng được tạo bằng ROWDEPENDENCIES. Giá trị mặc định là NOROWDEPENDENCIES. Rất tiếc, chúng tôi không thể sử dụng ALTER TABLE ở đây. Bạn sẽ cần phải thả và tạo lại bảng (*) để bật ROWDEPENDENCIES.
- SCN áp dụng cho giao dịch. Điều này có nghĩa là giải pháp sẽ chỉ hoạt động nếu mỗi hàng trong TEMP_TABLE được chèn vào một giao dịch riêng biệt.
- Rõ ràng điều này chỉ có thể thực hiện được nếu TEMP_TABLE là một bảng thực tế chứ không phải một chế độ xem hoặc một số cấu trúc khác.
Với tất cả các tiêu chí này đều được thỏa mãn, đây là một truy vấn sẽ cung cấp cho bạn tập kết quả mà bạn muốn:
select load, id
from ( select load
, id
, row_number() over (partition by load order by ora_rowscn desc) as rn
from temp_table
)
where rn = 1
Có bản trình diễn trên db <> fiddle . Ngoài ra, cùng một bản trình diễn ngoại trừ TEMP_TABLE được xác định bằng NOROWDEPENDENCIES, tạo ra kết quả sai .
(*) Nếu bạn cần giữ dữ liệu trong TEMP_TABLE, các bước là:
-
rename TEMP_TABLE to whatever;
-
create table TEMP_TABLE as select * from whatever rowdependencies;
-
drop table whatever;
Tuy nhiên, SCN sẽ giống nhau đối với các hàng hiện có. Nếu điều đó quan trọng, bạn sẽ phải chèn từng hàng một, theo thứ tự bạn muốn duy trì và cam kết sau mỗi lần chèn.