繁体   English   中英

使用外键填充事实表

[英]Populate fact table with foreign keys

我正在开发一个项目,我需要使用SSAS分析Apache日志。 我已经将数据加载到临时表中。 我创建了维度表(主键和attibute_name),空事实表(每个维度表和fact_attribute的外键)并创建了它们之间的关系。 然后我使用将该表中的数据拆分为维度表

INSERT INTO DimIP (IP) SELECT DISTINCT RemoteHostName FROM tmp

...等等。

现在我需要使用外键填充Fact表,但我不知道如何使用单个查询执行此操作。 我试过这样的事情:

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行”但没有插入任何内容。

我会感激你的帮助,因为我已经从头上撕下了一半的头发,不知道如何用尺寸表中的外键填充事实表。

我相信您需要做的是在查询中引用其他表。 下面我使用tmp作为查询的主要驱动程序,然后尝试根据您提供的逻辑查找生成的ID。 这些查找是通过LEFT OUTER JOIN的,这意味着关系可能不存在,在这种情况下,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表中计算行数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM