【问题标题】:SQL Server 2005: Insert one to many (1 Order-Many Charges) results into @tableSQL Server 2005:将一对多(1 Order-Many Charges)结果插入@table
【发布时间】: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

ProductID >

问题是:
如何在@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


    【解决方案1】:

    这应该可行:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-05
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多