Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Thứ tự SQL theo các phần tử từ mệnh đề IN

Mặc dù logic của bạn và các giải pháp ở trên phù hợp với quy mô nhỏ, nhưng nếu bạn đang nói về hơn 65000 mục, bạn cần một giải pháp có thể mở rộng.

Đề xuất của tôi là chia nhiệm vụ này thành 2 bước.

Bước 1

Tạo một bảng tạm thời, Bảng tạm thời này sẽ có 3 cột tối thiểu

TEMP_ITEM_ORDER_TABLE (
  session_key varchar2(50),
  item_id number,
  item_report_order number
)

Mỗi khi người dùng đặt hàng một truy vấn như vậy, hãy chèn dữ liệu, tức là id mục và số thứ tự của chúng vào bảng tạm thời này với một số khóa duy nhất để xác định phiên người dùng (có thể là id người dùng hoặc id phiên). Thủ thuật này là để tránh xung đột danh sách mục khi nhiều người dùng đồng thời kích hoạt báo cáo.

Bước 2

Bây giờ hãy kích hoạt truy vấn báo cáo của bạn bằng cách tham gia bảng chính, bảng tạm thời với session_key . Trong dữ liệu thứ tự truy vấn dựa trên thứ tự đầu vào của bạn (đã được lưu trữ trong bảng tạm thời)

SELECT 
  T1.* , T2.item_report_order
FROM ITEM T1, TEMP_ITEM_ORDER_TABLE T2
  WHERE T1.ITEM_ID = T2.ITEM_ID
  AND T2.session_key = :input_session_key
  ORDER BY t2.item_report_order

Phương pháp này là

  1. cơ sở dữ liệu bất khả tri
  2. có thể mở rộng với bất kỳ số lượng đầu vào nào
  3. Mang lại hiệu suất tốt nhất có thể

Lưu ý:Để cải thiện hơn nữa hiệu suất truy vấn, hãy tạo chỉ mục trên session_key, item_id trong bảng tạm thời cũng tạo chỉ mục trên item_id trên bảng ITEM (nếu chưa tồn tại)

Chỉnh sửa:Oracle cung cấp Bảng tạm thời toàn cầu tính năng này tạo ra có các tính năng chỉ cho phép bản ghi trong phiên và tự động dọn dẹp khi cam kết / kết thúc phiên, v.v. Bạn có thể sử dụng tính năng này và tránh khóa phiên, nhưng giải pháp này không thể được sao chép trên các sản phẩm cơ sở dữ liệu khác trừ khi chúng hỗ trợ tính năng tương tự.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gọi hàm gói Oracle bằng Odbc từ C #

  2. Lỗi SQL:ORA-12899:giá trị quá lớn cho cột

  3. Tại sao thủ tục được lưu trữ này lại chèn các giá trị NULL vào bảng?

  4. Thay đổi truy vấn này thành nhóm các hàng và lọc ra tất cả các hàng ngoài hàng có giá trị nhỏ nhất

  5. Tìm các hàng trùng lặp trong cơ sở dữ liệu