2015-12-29 44 views
0

好了複雜的數據遷移,所以這是一個有趣的問題...SQL - 從舊體制到新結構

我想將數據從OldApplicationLogs移動表兩張表:

  1. UserSessionLogs
  2. ApplicationLogs

這是OldApplicationLogs的結構:

ID INT-PK 
UserID INT-FK 
PropertyID INT-FK 
Controller VARCHAR 
Action VARCHAR 
EntityType VARCHAR 
EntityKey VARCHAR 
AbsoluteURL VARCHAR 
IPAddress VARCHAR 
... 

這些都是我想將它移動到新的結構:

UserSessionLogs

ID INT-PK 
UserID INT-FK 
PropertyID INT-FK 
IPAddress INT-FK 
... 

ApplicationLogs

ID INT-PK 
UserSessionLogID INT-FK 
EntityID INT-FK 
EntityKey INT 
Controller VARCHAR 
Action VARCHAR 
RelativeURL VARCHAR 
Created VARCHAR 
... 

現在的做法我有記住:

  1. 將所有唯一的UserID,PropertyID,IPAddress視爲 UserSessionLogs的一行。
  2. 將數據從舊的應用程序日誌結構移動到新的應用程序日誌結構。

這裏有雲的SQL語句我開始寫...

SQL代碼,推薦給您的眼睛http://kendtimothy.com/static/logs_so_30-12-2015.pdf

否則,這是SQL代碼:

  1. 將每個用戶事件的過去數據映射爲一個用戶會話。

    SELECT 
        ID, PropertyID, UserID, IPAddress INTO UserSessionLogs 
    FROM 
        OldApplicationLogs 
    GROUP BY 
        PropertyID, UserID, IPAddress 
    

問題1:循環遍歷結果,將其插入UserSessionLogs。

INSERT INTO UserSessionLogs (PropertyID, IPAddress, UserID, StartDate) 
VALUES (UserSessionLogs.PropertyID, UserSessionLogs.IPAddress, UserSessionLogs.UserID) 
所有應用日誌
  • 地圖過去的數據到新的結構。

    SELECT * 
    INTO AppLogs 
    FROM OldApplicationLogs 
    
  • 問題2:同樣,我需要遍歷結果並插入ApplicationLogs

    INSERT INTO ApplicationLogs (UserSessionLogID, [Action], Controller, Operation, Created, EntityID, EntityKey, RelativeURL) 
    VALUES (
    

    問題3:我怎樣才能得到相關UserID其中PropertyIDUserIDIPAddress組合匹配?

    UserSessions.ID, 
    AppLogs.Action, 
    AppLogs.Controller, 
    AppLogs.Operation, 
    AppLogs.LoggedDate 
    

    獲取具有相同表名的EntityID

    (SELECT TableName 
    FROM Entities 
    WHERE AppLogs.EntityType = Entities.TableName), 
    

    演員以前VARCHAR的EntityKey到INT?的EntityKey。保持NULL原樣。

    CAST(AppLogs.EntityKey AS INT), 
    

    將絕對URL(從過去的結構)轉換爲相對URL。

    問題4 /建議:更好的方法來做到這一點任何建議超歡迎:)

    REPLACE(AppLogs.AbsoluteURL, 'www.myapp.com/', '') 
    ) 
    

    我會很感激的幫助/建議在此,歡呼:)

    +0

    問題是什麼? –

    +0

    @StanShaw問題實際上標記爲SQL代碼中的註釋。我將它標記爲 - 問題1, - 問題2等。希望它不會太麻煩。基本上,如何實現循環查詢結果並獲取與問題3相匹配的ID。 –

    +1

    是的,你不需要遍歷任何東西,但是你應該根據連接編寫插入來保存你的原始關聯。我現在沒有時間回答,但會嘗試幫助編輯您的帖子以保持清晰。 –

    回答

    1

    無循環在這裏是必要的。在處理數據集時,SQL是最好的。

    沒有表格的完整DDL,這可能有點關閉。

    INSERT INTO [UserSessionLogs]([PropertyID], [IPAddress], [UserID]) 
    SELECT [PropertyID], [UserID], [IPAddress] 
    FROM [OldApplicationLogs] 
    GROUP BY [PropertyID], [UserID], [IPAddress]; 
    
    INSERT INTO [ApplicationLogs]([UserSessionLogID], [Action], [Controller], [Operation], [Created], [EntityID], [EntityKey], [RelativeURL]) 
    SELECT 
        B.[ID], 
        A.[Action], 
        A.[Controller], 
        A.[Operation], 
        A.[LoggedDate], 
        C.[TableName], 
        CAST(A.[EntityKey] AS INT), 
        REPLACE(A.[AbsoluteURL],'www.myapp.com/','') 
    FROM [OldApplicationLogs] A 
    INNER JOIN [UserSessionLogs] B 
    ON  A.[UserID] = B.[UserID] 
    LEFT JOIN [Entities] C 
    ON  A.[EntityType] = C.[TableName] 
    

    C.[TableName]看起來這將是一個VARCHAR,而不是按你的ApplicationLogs定義的ID。也許你打算使用EntityID而不是TableName

    +0

    是的,我想C. [ID]而不是C. [TableName]。這樣做太好了,只需要很小的調整。你一直是一個偉大的幫助隊友。非常感謝! :) –