2015-07-10 38 views
0

表比方說,我有如下表:插入不同的值與標識

camp_1, camp_2 
0, 048 
00, 048 
000, 042 
000, 043 

我現在希望將這些值插入到一個新表dim_promotion,這應該是這樣的:

PromotionID, CampaignID, CouponID 
1, 1, 1 
2, 2, 1, 
3, 3, 2, 
4, 3, 3 

我知道我可以做這種填充表(該站在後面的CampaignID和CouponID dim_campaigns和dim_coupons):

INSERT INTO [REPORTING].dbo.dim_campaigns 
SELECT DISTINCT 
camp_2 AS CampaignID 
FROM [reporting2].[dbo].[reporting_rawdata_v2] 

相應的三個表(dim_coupons,dim_campaigns和dim_promotion)的主鍵都設置爲「Identity Specification = YES」

那麼如何填充dim_promotion?什麼是自然秩序?首先派生dim_campaigns和dim_coupons,然後將其轉化爲dim_promotion或者其他方式?

編輯:我有以下數據庫模型(只有一個摘錄)我只指的是黃色的領域。

現在,我們只有大表(rawdatatbl)存儲所有數據(CampaignCode,CouponCode,Campaign Name,CouponName)。這不是非常有效,這就是爲什麼我要強制重構模型(請參見屏幕截圖)。所以,由於目前數據並不包含任何ID,我確實需要ID來填充新表dim_campaigns和dim_coupons。這意味着:要填充dim_campaigns,我會在當前rawdatatbl上運行SELECT DISTINCT campaign_code,然後將其插入dim_campaigns(CampaignID會自動使用auto_increment填充,CampaignName使用「Dummy」填充)。我可以爲dim_coupons做同樣的事情。但是,我如何使用這些數據來初始化Dim_promotion表?或者什麼是將我當前數據從rawdatatbl轉換爲ID的最佳流程? enter image description here

+1

我不明白你要插入的數據的邏輯......請解釋一些細節(約底層表和業務規則) – Shnugo

+1

你的問題是模糊的。請通過提供表格結構來說明一下。無論如何,如果你的問題是一些列的*身份*規範,你可以通過'SET IDENTITY_INSERT table_name ON'臨時禁用此功能;' – Ormoz

+0

我編輯了我的第一個問題。這對我來說很難解釋 – stefan

回答

0

一種可能的方式是: -

---- insert your all distinct Campaign data 
Insert Into dim_campaigns(CampaignCode,CampaignName) 
Select Distinct 
     cm.CampaignCode 
     ,cm.CampaignName 
From rawdatatbl As cm 

---- insert your all distinct Coupon data 
Insert Into dim_coupons(CouponCode,CouponName) 
Select Distinct 
     c.CouponCode 
     ,c.CouponName 
From rawdatatbl As c 


Declare @Total    Int 
     ,@Inc    Int 
     ,@RowId    Int 
     ,@CampaignCode  Varchar(100) 
     ,@CouponCode  Varchar(100) 

     ----Primary keys 
     ,@CampaignId  Int 
     ,@CouponId   Int 
     ,@PromotionID  Int 



Select @CampaignCode = '' 
     ,@CouponCode = '' 

----loop through one by one and take necessary action 
Select @Total = Count(1) 
     ,@Inc = 0 
     ,@RowId = 0 
From rawdatatbl As c With (Nolock) 

While (@Inc < @Total) 
Begin 
    Select Top 1 
      @RowId = [TableUniqueId] 
      ,@CampaignCode = c.CampaignCode 
      ,@CouponCode = c.CouponCode 
      ---- others columns 
    From rawdatatbl As c 
    Where [TableUniqueId] > @RowId 
    Order By [TableUniqueId] Asc 

    Select @CampaignId = dc.CampaignId 
    From dim_campaigns As dc 
    Where dc.CampaignCode = @CampaignCode 

    Select @CouponId = dc.CouponId 
    From dim_coupons As dc 
    Where dc.CouponCode = @CouponCode 

    If (@CampaignId > 0 And @CouponId > 0) 
    Begin 
     Insert Into dim_promotion(CampaignID,CouponID) 
     Select @CampaignId,@CouponId 

     Select @PromotionID = @@Identity 

     ---- other operation insert/update based on @PromotionID you can do here. 
    End 


    Select @Inc = @Inc + 1 
      ,@CampaignCode = '' 
      ,@CouponCode = '' 
      ,@CampaignId = 0 
      ,@CouponId = 0 
End