2011-11-26 4 views
0

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.) 할 수없는, 쿼리가 실패 때때로 쿼리를 실행하므로 말한다 :

I는 다음과 같이, 그것을 하나 하나를 수행 시도 "806000 rows affected"하지만 아무것도 삽입되지 않습니다.

나는 이미 내 머리에서 내 머리카락의 절반을 찢어 버렸고 차원 테이블의 외래 키를 사용하여 팩트 테이블을 채우는 방법을 모르겠다.

답변

2

당신이해야 할 일은 쿼리의 다른 테이블을 참조하는 것입니다. 아래에서는 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 테이블의 행을 계산하지 않는 한 당신은, 측정 무언가를 놓치고있는 것 같다.

+0

감사합니다. 훌륭한 작품입니다. 그게 내가 필요한 것입니다. 측정 값으로 BytesSent를 추가하고 사실 테이블이 완벽하게 채워집니다. – Meff