我有一份订单列表
订单
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。
8.99
将适用于客户32的所有Products
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>
如果有一些方法,那么显然会有金牌: 如果有多个费用,那么对于每个多次充电,将 orderid / chargeID 插入子查询返回的值超过1。当子查询遵循=,!=,&lt;,&lt; =,&gt;时,不允许这样做。 &gt;,&gt; =或当子查询用作表达式
时
@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
)
答案 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