1

我有一个订单列表

订单

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
)
4

1 回答 1

2

这应该有效:

SELECT O.OrderId, C.ChargeId
FROM Orders O
  JOIN Charges C ON O.CustomerId = C.CustomerId AND
    (C.ProductId = O.ProductId OR C.ProductId = 0)
ORDER BY O.OrderId, C.ChargeId

这是示例Fiddle

它会产生以下结果:

ORDERID   CHARGEID
1         1
1         2
2         3
2         4
3         5
4         1
于 2013-02-19T16:10:10.987 回答