【发布时间】:2013-02-04 09:18:42
【问题描述】:
我有一个订单列表
订单
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将适用于客户 32 的所有Products - 费用 2 -
10.05仅适用于客户 32 的产品ID=15
因此:OrderID = 4 将没有 Subcharge Delivery,因为找不到 客户 32
问题是:
如何在@tempQuote 表中填写这些订单的报价?
因此,在这种情况下所需的结果集将是:
OrderID ChargeID
--------------------
1 1
1 2
2 3
2 4
3 5
4 1
问题是我不能简单地将 OrderIDs 插入@tempQuotes 表中,然后收取费用,因为可能有多次费用,然后我得到错误
子查询返回超过 1 个值。当子查询跟随 =、!=、 >、>= 或子查询用作表达式时,这是不允许的
如果有一些方法,金牌显然会是:
如果有多个收费,则对于每个多个收费,将 orderid/chargeID 插入到@tempQuotes 表中
例如
如果只有 1 行,或者如果有多个费用,则更新 @tempQuotes 表
插入每个订单/费用
要么
将所有适用的 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
)
【问题讨论】:
标签: sql sql-server-2005