如何在多对多插入中生成映射表

时间:2012-11-06 23:30:47

标签: sql database sql-server-2008 database-design

我在交易所有一份公司的交易表。因此,对于某一天,我可以为公司进行多笔交易。我现在想要进行这些交易并将它们分组到位。

交易可以低于多个位置,具体取决于其属性,如国家,类型等 一个职位可以由许多行业组成。

所以我有以下表格

表格交易

Id   Date      Company   Trade  Type
1 2012-11-01     IBM     1000    A
2 2012-11-01     IBM     3000    B
3 2012-11-01     Dell    1000    A
4 2012-11-01     HP      5000    A
5 2012-11-01     HP      6000    A
6 2012-11-01     HP      7000    B

表TradePositionMapping

PK     TableTradeID      PositionID
1          1                100      --IBM 1000
2          1                101      --IBM 1000
3          2                101      --IBM 3000
4          3                102      --Dell 1000
5          4                103      --HP 5000
6          5                103      --HP 6000
7          4                104      --Hp 5000
7          5                104      --Hp 6000
7          6                104      --Hp 7000

表格位置

PK   Company Position
100   IBM      1000
101   IBM      4000
102   Dell     1000
103   Hp      11000
104   Hp      18000

因此,在IBM Trade ID 1上方的位置中,有2个位置100和101. Trade Id 2也进入了位置101,总计4000个

好的,所以这个想法是交易可以组成一个或多个头寸,一个头寸可以有很多交易。业务逻辑将确定交易流向的位置,因此我现在使用A和B作为标志作为示例。

所以问题是......

当我从交易表中选择并汇总时,我将从各种交易中组成的所有新头寸插入到头寸表中。现在,创建映射表的最佳方法是什么。

我现在所做的是将新创建的Position Ids存储在一个临时表中,然后重复我要做的选择以便首先生成位置..并加入到临时表中。这似乎是很多重复的代码,我想知道最好的做法是做什么的。

最好的问候米克

2 个答案:

答案 0 :(得分:0)

您应该使用TableTradeID,PositionID。

创建一个简单的表TradePositionMapping

然后根据您的业务逻辑:
(0.)开始交易
1.插入位置
2.获取PositionID
3.将TableTradeID,PositionID对插入TradePositionMapping
(4.)提交

应该是这么简单。

您可以提前计算位置的总和,以便在提交之前插入或更新它。

答案 1 :(得分:0)

好的,经过更多的研究,我认为采用的方法是最好的方法。创建映射以将一个表中的源行连接到另一个表中的聚合行时的两种思想是

1遍历源行并使用游标处理数据组。然后在Destination表中插入1个聚合记录,并使用新ID在Mapping表中构建Mappings。然而,游标可能会很昂贵。

2我采用的另一种方法和方法是从源表中提取和聚合数据,并将批量插入到Destination表中,将新ID存储在临时表变量中。诀窍是确保您还可以根据需要复制分组的条件,以便将记录连接在一起以创建映射。

以此为例:

:方向为L为Long,S为short :PK是所有表中的标识列

:没有时间构建正确的代码,请原谅任何语法错误。

表交易 - 这是我们的源表



    TradeId    Date      Company   Trade  Direction
    10      2012-11-01     IBM     1000         L
    20      2012-11-01     IBM     3000         L
    30      2012-11-01     IBM     5000         S
    40      2012-11-01     Dell    1000         S
    50      2012-11-01     Dell    2000         S
    60      2012-11-01     Dell    3000         S
    70      2012-11-01     HP      5000         L
    80      2012-11-01     HP      6000         L
    90      2012-11-01     HP      7000         S
    100     2012-11-02     ORA     1000         S
    110     2012-11-02     ORA     1000         S
    120     2012-11-02     ORA     1000         S

所以选择所有交易并根据公司和方向汇总它们

declare @feedDate DateTime = '2012-11-01'  -- feed date to run for
declare @newPositionIds Table (newPositionId bigint)  -- temp table to store new PositionId

-- Aggregate and insert the trades only for the feed date. ORA should not be processed
Insert into Position (Company, Direction, Position)
 Output inserted.PositionID         
  Into @newPositionIds (newPositionId)
select Company, Direction, sum(Trade)
  from Trade t where t.date = @feedDate 
    group by Company, Direction

declare @feedDate DateTime = '2012-11-01' -- feed date to run for declare @newPositionIds Table (newPositionId bigint) -- temp table to store new PositionId -- Aggregate and insert the trades only for the feed date. ORA should not be processed Insert into Position (Company, Direction, Position) Output inserted.PositionID Into @newPositionIds (newPositionId) select Company, Direction, sum(Trade) from Trade t where t.date = @feedDate group by Company, Direction

这应该将这些记录添加到Positions表

表格位置



    PositionID   Company Position   Direction    
    100             IBM      4000         L
    200             IBM      5000         S
    300             Dell     6000         S
    400             Hp      11000         L
    500             Hp      7000          S

ok现在我们要填写Mapping表,其中包含用于聚合每个位置的记录

所以我们需要将交易加入到这些位置,但我们需要使用与以前分组相同的标准。这就是我们需要将该标准插入位置表

的原因

所以这次我们选择所有交易但不要求它们并加入到位置表中..然后将结果插入到映射表中。所以这是通过查询中的构建2派生表来完成的.1代表交易,另一代代表职位,并将它们连接起来用于首先对它们进行分组的标准。我们从这两个查询中得到的只是PK Id的

-- Select Trades for the feed date. ORA should not be included
Insert into TradePositionMapping(t.TradeID, p.PositionID)
(  select TradeId, Company, Direction, Trade            -- select the Trades
      from Trade t where t.date = @feedDate ) t
inner join
               -- join to temp table as we are only interested in the new ids we inserted
(select PositionId, Company,Direction from Position pos  
    inner join @newPositionIds npIds on pos.PositionId = npIds.newPositionIds
) p
on t.Company = p.Company and t.Direction = p.Direction

这应该给我们以下映射表

表TradePositionMapping - TPM



    TPM_PK   TradeID      PositionID
    1          10            100      --IBM 1000  L
    2          20            100      --IBM 3000  L
    3          30            200      --IBM 5000  S
    4          40            300      --Dell 1000 S
    5          50            300      --Dell 2000 S
    6          60            300      --Dell 3000 S
    7          70            400      --Hp 5000   L
    7          80            400      --Hp 6000   L
    7          90            500      --Hp 7000   S

因此,我们也可以将Feed作为标准加入到临时表中,而不是加入到临时表中,但是临时表也可以正常工作,因为我不想在我的职位表中使用日期文件

所以现在我可以看到Trades使用映射表构成了什么位置。

我希望这可以帮助任何人查看批量插入并生成映射表。

尊重M