Заполните таблицу фактов внешними ключами - PullRequest
0 голосов
/ 26 ноября 2011

Я работаю над проектом, в котором мне нужно анализировать журналы Apache с использованием SSAS. Я уже загрузил данные во временную таблицу. Я создал таблицы измерений (первичный ключ и 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 строк затронуто», но ничего не вставлено.

Буду признателен за вашу помощь, потому что я уже вырвал половину своих волос из головы и не знаю, как заполнить таблицу фактов внешними ключами из таблиц измерений.

1 Ответ

2 голосов
/ 26 ноября 2011

Я считаю, что вам нужно сослаться на эти другие таблицы в вашем запросе.Ниже я использую tmp в качестве основного драйвера запроса, а затем попытался найти полученный идентификатор на основе предоставленной вами логики.Эти поиски выполняются через 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...