注文のリストがあります
注文
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-お客様32
8.99
のすべてに適用されますProducts
- 料金2-顧客32の
10.05
製品にのみ適用されますID=15
したがって、顧客32のProductIDが見つからないため
OrderID = 4
、サブチャージ配信は行われません。
質問は:これらの注文の見積もりをテーブル
に記入するにはどうすればよいですか?@tempQuote
したがって、この場合に必要な結果セットは次のようになります。
OrderID ChargeID
--------------------
1 1
1 2
2 3
2 4
3 5
4 1
問題は、 OrderIDをテーブルに単純に挿入して@tempQuotes
から料金を適用できないことです。これは、複数の料金が発生する可能性があり、エラーが発生するためです。
サブクエリは複数の値を返しました。サブクエリが=、!=、<、<=、>>、> =の後に続く場合、またはサブクエリが式として使用される場合、これは許可されません。
金メダルは、次のような手段があれば明らかになります。複数の請求がある場合は、複数の請求ごとにorderid / ChargeIDをテーブルに挿入します。たとえば、行が1つしかない場合、または複数の請求がある場合は@tempQuotes
、テーブルを更新します。@tempQuotes
各注文/請求を挿入するか、適用されるすべての請求IDを追加の列に保存します@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
)