Chỉnh sửa 1 (làm rõ): Cảm ơn bạn đã trả lời cho đến nay! Câu trả lời là hài lòng.
Tôi muốn làm rõ câu hỏi một chút vì dựa trên câu trả lời Tôi nghĩ rằng tôi đã không mô tả một khía cạnh của vấn đề một cách chính xác (và tôi chắc chắn đó là lỗi của tôi vì tôi đã có một thời gian khó xác định nó ngay cả cho bản thân mình).
Đây là chà: Tập kết quả chỉ nên chứa các bản ghi với tstamp GIỮA '2010-01-03' VÀ '2010-01-09', và một bản ghi trong đó tstamp IS NULL cho mỗi order_num trong lần đầu tiên được đặt (sẽ có luôn là là một giá trị có tstamp không cho mỗi đơn đặt hàng).
Các câu trả lời được đưa ra cho đến nay dường như bao gồm tất cả bản ghi cho một trật tự nhất định nếu có bất kỳ với tstamp GIỮA '2010-01-03' VÀ '2010-01-09'. Ví dụ: nếu có một bản ghi khác với order_num = 2 và tstamp = 2010-01-12 00:00:00 thì phải không phải là trong kết quả.SQL hiệu quả hơn sử dụng "A UNION (B in A)"?
gốc câu hỏi:
Hãy xem xét một bảng lệnh chứa id (unique), order_num, tstamp (một timestamp) và item_id (các mục duy nhất bao gồm trong một thứ tự). tstamp là null, trừ khi thứ tự đã được sửa đổi, trong trường hợp đó có một bản ghi khác với order_num giống hệt nhau và tstamp sau đó chứa dấu thời gian khi thay đổi xảy ra.
Ví dụ ...
id order_num tstamp item_id __ _________ ___________________ _______ 0 1 100 1 2 101 2 2 2010-01-05 12:34:56 102 3 3 113 4 4 124 5 5 135 6 5 2010-01-07 01:23:45 136 7 5 2010-01-07 02:46:00 137 8 6 100 9 6 2010-01-13 08:33:55 105
các câu lệnh SQL hiệu quả nhất để lấy tất cả các đơn đặt hàng (dựa trên order_num) mà đã được sửa đổi một hoặc nhiều lần trong một phạm vi ngày nhất định là gì? Nói cách khác, đối với mỗi đơn đặt hàng chúng tôi cần tất cả các hồ sơ với cùng một order_num (bao gồm cả một với NULL tstamp), cho mỗi order_num WHERE ít nhất một trong số order_num có tstamp NOT NULL và tstamp BETWEEN '2010-01-03' VÀ '2010-01-09'. Đó là "WHERE ít nhất một trong số order_num có tstamp NOT NULL" mà tôi đang gặp khó khăn với.
Tập kết quả sẽ giống như thế này:
id order_num tstamp item_id __ _________ ___________________ _______ 1 2 101 2 2 2010-01-05 12:34:56 102 5 5 135 6 5 2010-01-07 01:23:45 136 7 5 2010-01-07 02:46:00 137
SQL mà tôi đã đưa ra là thế này, mà chủ yếu là "Một UNION (B trong A)", nhưng nó thực thi chậm và tôi hy vọng có là một giải pháp hiệu quả hơn:
SELECT history_orders.order_id, history_orders.tstamp, history_orders.item_id FROM (SELECT orders.order_id, orders.tstamp, orders.item_id FROM orders WHERE orders.tstamp BETWEEN '2010-01-03' AND '2010-01-09') AS history_orders UNION SELECT current_orders.order_id, current_orders.tstamp, current_orders.item_id FROM (SELECT orders.order_id, orders.tstamp, orders.item_id FROM orders WHERE orders.tstamp IS NULL) AS current_orders WHERE current_orders.order_id IN (SELECT orders.order_id FROM orders WHERE orders.tstamp BETWEEN '2010-01-03' AND '2010-01-09');
Tôi tò mò về hiệu suất của các truy vấn được cung cấp, có thể bạn có thể chia sẻ kết quả kiểm tra? –
Tôi sẽ báo cáo về cải thiện hiệu suất của giải pháp cuối cùng trong thời gian ngắn - điều đó rất quan trọng. – machinatus