我有一个订单列表
订单
OrderID CustomerID ProductID
-------------------------------------
1 32 15
2 16 28
3 7 20
4 32 16
以及需要适用于这些订单的费用清单
收费
ChargeID CustomerID ProductID Charge Desc
--------------------------------------------------------------------
1 32 0 8.99 Basic Cost Per Order
2 32 15 10.05 Subcharge: Delivery
3 16 28 8.99 Basic Cost Per Order
4 16 0 16.05 Subcharge: Delivery
5 7 20 17.99 Basic Cost Per Order
笔记:
在charges
中,如果是ProductID = 0
,则表示该费用将适用于所有产品。
例如
- 费用 1 -
8.99
将适用于所有Products
客户 32 - 费用 2 -
10.05
仅适用ID=15
于客户 32 的产品
因此:由于未找到客户 32的ProductID
OrderID = 4
,因此不会进行Subcharge Delivery
问题是:
如何在@tempQuote
表格中填写这些订单的报价?
因此,在这种情况下所需的结果集将是:
OrderID ChargeID
--------------------
1 1
1 2
2 3
2 4
3 5
4 1
问题是我不能简单地将OrderID插入@tempQuotes
表中,然后收取费用,因为可能有多次费用,然后我得到错误
子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、> >、>= 或子查询用作表达式时,这是不允许的
如果有一些方法,金牌显然会是:如果有多次收费,那么对于每个多次收费,将orderid/chargeID插入@tempQuotes
表中,例如,@tempQuotes
如果只有 1 行,或者如果有多次收费,则更新表插入每个订单/费用或将所有适用的ChargeID保存到@tempQuotes
附加列中,例如
OrderID, ChargeID
1 1,2
而不是更新费用,例如
Insert into @tempQuotes(OrderID)
select OrderID from #Orders
Update t
set ChargeID = (Select #Charges.ChargeID from @tempQuotes t
inner join #Orders on t.OrderID = #Orders.OrderID
inner join #Charges on #Orders.CustomerID = #Orders.CustomerID)
from @tempQuotes t
select * from @tempQuotes
表的设置:
IF OBJECT_ID('tempdb..#Orders') IS NOT NULL
BEGIN
drop table #Orders
END
IF OBJECT_ID('tempdb..#Charges') IS NOT NULL
BEGIN
drop table #Charges
END
create table #Orders(
OrderID int identity(1,1),
CustomerID int,
ProductID int,
)
Insert into #Orders(CustomerID,ProductID) values (32,15)
Insert into #Orders(CustomerID,ProductID) values (16,28)
Insert into #Orders(CustomerID,ProductID) values (7,20)
Insert into #Orders(CustomerID,ProductID) values (32,16)
create table #Charges(
ChargeID int identity(1,1),
CustomerID int,
ProductID int,
Charge decimal(10,2),
[Desc] nvarchar(50),
)
Insert into #Charges(CustomerID,ProductID,Charge,[Desc]) values (32, 0, 8.99, 'Basic Cost Per Order')
Insert into #Charges(CustomerID,ProductID,Charge,[Desc]) values (32, 15, 10.05, 'Subcharge: Delivery')
Insert into #Charges(CustomerID,ProductID,Charge,[Desc]) values (16, 28, 8.99, 'Basic Cost Per Order')
Insert into #Charges(CustomerID,ProductID,Charge,[Desc]) values (16, 0, 16.05, 'Subcharge: Delivery')
Insert into #Charges(CustomerID,ProductID,Charge,[Desc]) values (7, 20, 17.99, 'Basic Cost Per Order')
declare @tempQuote table(
OrderID int,
ChargeID int
)
declare @tempQuote table(
OrderID int,
ChargeID int
)