我的任务是对产品包进行逆向工程。
我们有2个套装,一个带有3个商品,一个带有4个商品。
示例:
捆绑表
SKU 1 Bundle 1
SKU 2 Bundle 1
SKU 3 Bundle 1
SKU 4 Bundle 1
SKU 5 Bundle 2
SKU 6 Bundle 2
SKU 7 Bundle 2
SKU 8 Bundle 2
SKU 9 Bundle 2
我需要找到所有捆绑产品中具有相应SKU的每个订单。
我可以轻松进行硬编码,但这不是最好的方法...
select 'BUNDLE 1'
from dbo.[Order] o
where exists (select 1 from dl.OrderItem ol where ol.Order_ID = o.Order_ID and ol.SKUVariant = 'SKU1')
and exists (select 1 from dl.OrderItem ol where ol.Order_ID = o.Order_ID and ol.SKUVariant = 'SKU2')
and exists (select 1 from dl.OrderItem ol where ol.Order_ID = o.Order_ID and ol.SKUVariant = 'SKU3')
and exists (select 1 from dl.OrderItem ol where ol.Order_ID = o.Order_ID and ol.SKUVariant = 'SKU4')
有没有办法动态地比较数据集?
预先感谢您提供此信息,让我知道您是否还有想要的信息。
答案 0 :(得分:0)
似乎您正在寻找类似的东西
with
bundles_cte(SKUVariant, BundleNum) as (
select * from (values ('SKU1', 1), ('SKU2', 1), ('SKU3', 1),
('SKU4', 1), ('SKU5', 2), ('SKU6', 2),
('SKU7', 2), ('SKU8', 2), ('SKU9', 2)),
bundles_sum_cte(BundleNum, ItemCount) as (
select BundleNum, count(*) from bundles_cte group by BundleNum),
orders_cte(Order_ID, BundleNum, ItemCount) as (
Select o.Order_ID, bc.BundleNum, count(distinct bc.SKUVariant)
from dbo.[Order] o
join dbo.OrderItem oi on o.Order_id=oi.Order_id
join bundles_cte bc on oi.SKUVariant=bc.SKUVariant
group by o.Order_ID, bc.BundleNum)
select o.*
from orders_cte o
where exists(select 1
from bundles_sum_cte bsc
where bsc.BundleNum=o.BundleNum
and bsc.ItemCount=o.ItemCount);
答案 1 :(得分:0)
我认为您的答案是这样的。 而且我以为您的捆绑包表的名称类似于“ dbo.BundlesTable”
select 'Bundle 1'
from dbo.[order] o
where not exists
((select SKU
from dbo.BundlesTable
where Bundle = 'Bundle 1')
except
(select SKUVariant
from dl.OrderItem ol
where ol.Order_ID = o.Order_ID))
答案 2 :(得分:0)
感谢您的答复。我也无法应用它们,因为它们也是硬编码的。
最后,我开发了一个游标,以提供所需的文本,该文本根据原始查询动态计算更新语句。然后使用光标输出中的变量对每个包进行更新。
从性能的角度来看,合适的游标并不是很好,但是我似乎已经用尽了所有的选择。
再次感谢
会