2017-07-11 7 views
0

私は、このファクトテーブルを持っている:ファクトテーブルの外部キー参照整合性 - T-SQL

CREATE TABLE [dbo].[FACT_TABLE] 
(
    [A_id] [int] NOT NULL, 
    [B_id] [int] NOT NULL, 
    [C_id] [int] NOT NULL, 
    [D_id] [int] NOT NULL, 
    [FACT_total] [float] NOT NULL, 
    [FACT_average] [float] NOT NULL, 

    CONSTRAINT [PK_FACT_TABLE] 
     PRIMARY KEY CLUSTERED ([A_id] ASC, [B_id] ASC, 
           [C_id] ASC, [D_id] ASC) 
) ON [PRIMARY] 

私は私のファクトテーブルにデータをロードするためにT-SQLスクリプトを持っている:

INSERT INTO [dbo].[FACT_TABLE] ([A_id], [B_id], [C_id], [company_id], [D_id],[FACT_total], [FACT_average]) 
    SELECT 
     b.A_id, c.B_id, d.C_id, e.D_id, 
     AVG(FACT_total) AS FACT_total, 
     AVG(FACT_average) AS FACT_average 
    FROM 
     [dbo].[staging_Area] a 
    INNER JOIN 
     [dbo].[DIM_A] b ON a.A_id = b.A_id 
    INNER JOIN 
     [dbo].[DIM_B] c ON a.[B_id] = c.B_id 
    INNER JOIN 
     [dbo].[DIM_C] d ON a.[C_id] = d.C_id 
    INNER JOIN 
     [dbo].[DIM_D] e ON a.D_id = e.D_id 
    GROUP BY 
     b.A_id, c.B_id, d.C_id, e.D_id 

参照整合性エラーを取得しないために、ファクトテーブルに重複値を挿入しないようにするにはどうすればよいですか?

誰でもこのため、別の選択肢を持っている...

EXCEPT 
SELECT * 
FROM [dbo].[FACT_TABLE] 

しかし、私はそれが、このための最善のアプローチではないと思います。

私はそのクエリの後に、次の文を使用してみましたか?申し訳ありませんが、私は実際の列とテーブルの名前を置くことができません...

ありがとう!

ファクトテーブルに WHERE FT.Column IS NULL
+0

重複をどのように定義しますか?レコード全体であれば、すべての列をコンポジットキーとして入れてください – LONG

答えて

1

LEFT OUTER JOINあなたはすでに存在しているレコードを挿入していないことを確認する:[FACT_TABLE]

([A_ID] [DBO] INTO

INSERT INTO [dbo].[FACT_TABLE] ([A_id],[B_id],[C_id],[company_id],[D_id],[FACT_total],[FACT_average]) 
SELECT b.A_id 
     ,c.B_id 
     ,d.C_id 
     ,e.D_id 
     ,AVG(FACT_total) AS FACT_total 
     ,AVG(FACT_average) AS FACT_average 
FROM [dbo].[staging_Area] a 
INNER JOIN [dbo].[DIM_A] b ON 
    a.A_id = b.A_id 
INNER JOIN [dbo].[DIM_B] c ON 
    a.[B_id] = c.B_id 
INNER JOIN [dbo].[DIM_C] d ON 
    a.[C_id] = d.C_id 
INNER JOIN [dbo].[DIM_D] e ON 
    a.D_id = e.D_id 
LEFT OUTER JOIN dbo.[FACT_TABLE] FT 
    ON b.A_ID = FT.A_id 
    AND c.B_id = FT.B_id 
    AND D.C_ID = FT.C_id 
    AND E.D_id = FT.D_id 
WHERE FT.A_ID IS NULL 
GROUP BY b.A_id 
     ,c.B_id 
     ,d.C_id 
     ,e.D_id 
+0

実際には、 'DISTINCT'は冗長です。既にグループ化しているので、重複を取得することはできません。私はそれを削除する答えを編集します。 –

0

INSERT、[B_ID ]、[C_ID]、[D_ID]、[FACT_total]、[FACT_average])

選択a.A_id、a.B_id、a.C_id、a.D_id、a.FACT_total、a.FACT_average

からFROM

b.A_id, c.B_id, d.C_id, e.D_id, 
AVG(FACT_total) AS FACT_total, 
AVG(FACT_average) AS FACT_average 

[dbo].[staging_Area] a 

INNER

[dbo].[DIM_A] b ON a.A_id = b.A_id 

INNER JOINをJOIN選択

[dbo].[DIM_B] c ON a.[B_id] = c.B_id 

INNER

b.A_id, c.B_id, d.C_id, e.D_id 

)a 

ここ

BY

[dbo].[DIM_D] e ON a.D_id = e.D_id 

グループに参加する。[C_ID] = d.C_id

INNER ON [DBO]。[DIM_C] DをJOIN存在しません

( dbao.FACT_TABLE B


B.A_id = A.A_id AND B.B_id = A.B_idとb.C_id = a.C_idとb.D_id = Aから1を選択します。D_id

) 
+0

あなたはこれを@alenの書式設定に取り組むべきです - それは事実上読めません。 –

関連する問題