2011-11-26 109 views
0

我正在開發一個項目,我需要使用SSAS分析Apache日誌。我已經將數據加載到臨時表中。我創建了維表(主鍵和attibute_name),空的事實表(每個維表和fact_attribute的外鍵)並創建它們之間的關係。然後我將該表格中的數據分成尺寸表,使用使用外鍵填充事實表

INSERT INTO DimIP (IP) SELECT DISTINCT RemoteHostName FROM tmp 

...等等。

現在我需要用外鍵填充事實表,但我不知道如何用單個查詢來完成此操作。我想是這樣的:

INSERT INTO Facts (DimDateID, DimIPID, DimRefererID, DimRequestID, DimStatusCodeID, DimUserAgentID) 
SELECT DimDate.ID WHERE (DimDate.Data = tmp.DateTime) 
SELECT DimIP.ID WHERE (DimIP.IP = tmp.RemoteHostName) 
SELECT DimReferer.ID WHERE (DimReferer.Referer = tmp.Referer) 
SELECT DimRequest.ID WHERE (DimRequest.Request = tmp.Request) 
SELECT DimStatusCode.ID WHERE (DimStatusCode.StatusCode = tmp.StatusCode) 
SELECT DimUserAgent.ID WHERE (DimUserAgent.UserAgent = tmp.UserAgent) 

但它不工作(它說插入列表包含比選擇列表項較少),可能是我不能用這種語法。

我試圖做一個接一個,像這樣:

INSERT INTO Facts (DimDateID) 
SELECT DimDate.ID WHERE (DimDate.Data = tmp.DateTime) 

但有時候它說,其它列不能爲NULL(前DimUserAgentID。),所以查詢失敗,有時它執行查詢時,說「806000行受影響」但沒有插入任何內容。

我會感謝您的幫助,因爲我已經從我的頭上撕開了一半頭髮,並不知道如何使用維表中的外鍵填充事實表。

回答

2

我相信你需要做的是在你的查詢中引用其他表。在下面,我使用tmp作爲查詢的主要驅動程序,然後嘗試根據您提供的邏輯查找生成的ID。這些查找通過LEFT OUTER JOIN s,這意味着關係可能不存在,在這種情況下,NULL將進入事實表。如果您希望已將該行過濾出來,請將所有事件替換爲INNER JOIN。我還假定你的表都是dbo模式。

INSERT INTO 
    dbo.Facts 
(
    DimDateID 
, DimIPID 
, DimRefererID 
, DimRequestID 
, DimStatusCodeID 
, DimUserAgentID 
) 
SELECT 
    DimDate.ID 
, DimIP.ID 
, DimReferer.ID 
, DimRequest.ID 
, DimStatusCode.ID 
, DimUserAgent.ID 
FROM 
    TMP T 
    LEFT OUTER JOIN 
     dbo.DimDate 
     ON DimDate.Data = T.DateTime 
    LEFT OUTER JOIN 
     dbo.DimIP 
     ON DimIP.IP = T.RemoteHostName 
    LEFT OUTER JOIN 
     dbo.DimReferer 
     ON DimReferer.Referer = T.Referer 
    LEFT OUTER JOIN 
     dbo.DimRequest 
     ON DimRequest.Request = T.Request 
    LEFT OUTER JOIN 
     dbo.DimStatusCode 
     ON DimStatusCode.StatusCode = T.StatusCode 
    LEFT OUTER JOIN 
     dbo.DimUserAgent 
     ON DimUserAgent.UserAgent = T.UserAgent 

最後,您似乎失去了一些東西衡量,除非你只是在Facts表計數行。

+0

謝謝,作品精彩。這正是我需要的。我添加了BytesSent作爲度量,Fact表完美地填充。 – Meff