SQL Server 2005:将一对多(1个订单 - 多次费用)结果插入@table

时间:2013-02-19 15:59:37

标签: sql sql-server-2005

我有一份订单列表

订单

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,则表示该费用将应用于所有产品。

e.g。

  • 费用1 - 8.99将适用于客户32的所有Products
  • 费用2 - 10.05仅适用于客户32的产品ID=15

因此:
由于 customer 32 找不到 ProductID ,因此OrderID = 4将没有 Subcharge Delivery

问题是:
如何在@tempQuote表中填写这些订单的引号?

在这种情况下,所需的结果集将是:

OrderID ChargeID
--------------------
1       1
1       2   
2       3           
2       4
3       5
4       1

问题是我只是不能简单地将 OrderIDs 插入@tempQuotes表中,然后应用费用,因为可能有多次收费然后我收到错误< / p>

  

子查询返回的值超过1。当子查询遵循=,!=,&lt;,&lt; =,&gt;时,不允许这样做。 &gt;,&gt; =或当子查询用作表达式

如果有一些方法,那么显然会有金牌: 如果有多个费用,那么对于每个多次充电,将 orderid / chargeID 插入@tempQuotes表 例如 如果只有1行,或者如果有多个费用,则更新@tempQuotes表 插入每个订单/费用 要么 将{em> ChargeIDs 保存到@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
)

1 个答案:

答案 0 :(得分: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