Thiết lập
Tôi đã thiết lập một ví dụ về rextester và dbfiddle .
Kịch bản
Bảng giá : Đó là bảng giá sản phẩm, một Sản phẩm có thể có nhiều hơn một mức giá hoạt động, thậm chí là một mức giá trong tương lai.
+---------+-------+------------+--------+--------+
| product | price | date_price | base | active |
+---------+-------+------------+--------+--------+
| 0125 | 90 | 01.01.2017 | 1200 | 0 |
| 0125 | 100 | 25.01.2017 | 1000 | 1 |
| 0125 | 110 | 27.02.2017 | 500 | 1 |
+---------+-------+------------+--------+--------+
| 1200 | 140 | 01.01.2017 | 2000 | 0 |
| 1200 | 150 | 01.02.2017 | 1500 | 1 |
| 1200 | 160 | 27.02.2017 | 1000 | 1 |
+---------+-------+------------+--------+--------+
Đơn đặt hàng Các đơn đặt hàng đang chờ xử lý có giá và ngày đặt hàng
+---------+------------+-------+--------+
| product | order_date | price | base |
+---------+------------+-------+--------+
| 0125 | 19.02.2017 | 100 | 1000 |
| 0125 | 20.02.2017 | 100 | 1000 |
| 0125 | 21.02.2017 | 100 | 1000 |
| 0125 | 22.02.2017 | 100 | 1000 |
| 0125 | 23.02.2017 | 100 | 1000 |
| 0125 | 28.02.2017 | 110 | 500 |
+---------+------------+-------+--------+
| 1200 | 19.02.2017 | 150 | 1500 |
| 1200 | 20.02.2017 | 150 | 1500 |
| 1200 | 21.02.2017 | 150 | 1500 |
| 1200 | 22.02.2017 | 150 | 1500 |
| 1200 | 23.02.2017 | 150 | 1500 |
| 1200 | 28.02.2017 | 160 | 1000 |
+---------+------------+-------+--------+
Mỗi khi chúng tôi thêm một mức giá mới trong danh sách, chúng tôi phải cập nhật các hàng bị chờ xử lý.
Ví dụ: nếu chúng ta thêm:
+---------+-------+------------+--------+--------+
| product | price | date_price | base | active |
+---------+-------+------------+--------+--------+
| 0125 | 105 | 21.02.2017 | 1300 | 1 |
| 1200 | 155 | 21.02.2017 | 1400 | 1 |
+---------+-------+------------+--------+--------+
Bảng giá mới phải là:
+---------+------------+-------+--------+
| product | order_date | price | base |
+---------+------------+-------+--------+
| 0125 | 19.02.2017 | 100 | 1000 |
| 0125 | 20.02.2017 | 100 | 1000 |
| 0125 | 21.02.2017 | 105 | 1300 | *
| 0125 | 22.02.2017 | 105 | 1300 | * Affected rows
| 0125 | 23.02.2017 | 105 | 1300 | *
| 0125 | 28.02.2017 | 110 | 500 |
+---------+------------+-------+--------+
| 1200 | 19.02.2017 | 150 | 1500 |
| 1200 | 20.02.2017 | 150 | 1500 |
| 1200 | 21.02.2017 | 150 | 1500 | *
| 1200 | 22.02.2017 | 150 | 1500 | * Affectd rows between 21.02.2017 and 27.02.2017
| 1200 | 23.02.2017 | 150 | 1500 | *
| 1200 | 28.02.2017 | 160 | 1000 |
+---------+------------+-------+--------+
Tôi muốn cập nhật các hồ sơ bị ảnh hưởng bằng một truy vấn duy nhất.
Do có một mức giá khác bắt đầu từ ngày 27.02.2017, các đơn đặt hàng ngày 28.02.2017 không bị ảnh hưởng bởi giá chèn.
Quá trình thực tế
Đến bây giờ, tôi sử dụng một truy vấn con tìm kiếm ngày đầu tiên khớp với bảng danh sách giá, nhưng bây giờ tôi cũng cần cập nhật base
trường. (Và hai hoặc ba trường nữa) và tôi muốn tránh sử dụng hai hoặc nhiều truy vấn con.
update @orders
set price = (select top 1 pl.price
from @price_list pl
where pl.product = o.product
and pl.date_price <= o.order_date
and active = 1
order by pl.date_price desc),
base = (select top 1 pl.base
from @price_list pl
where pl.product = o.product
and pl.date_price <= o.order_date
and active = 1
order by pl.date_price desc)
from @orders o
where o.product in ('0125', '1200'); --<<< select distinct product from inserted
Xin vui lòng, để sửa văn bản của tôi, tôi biết ngữ pháp tiếng Anh của tôi không đủ tốt.