【问题标题】:Populate fact table with foreign keys用外键填充事实表
【发布时间】:2011-11-26 22:19:08
【问题描述】:

我正在开展一个需要使用 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 行受影响”但没有插入任何内容。

我将感谢您的帮助,因为我已经扯掉了一半的头发,并且不知道如何使用维度表中的外键填充事实表。

【问题讨论】:

    标签: sql-server ssis ssas


    【解决方案1】:

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

    【讨论】:

    • 谢谢你,效果很好。这正是我所需要的。我添加了 BytesSent 作为度量,事实表完美地填充。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多