2017-07-11 2 views
0

J'ai ce tableau fait:intégrité référentielle clé étrangère dans les tableaux de fait - 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] 

J'ai un script T-SQL pour charger des données dans ma table de fait:

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 

Comment puis-je garantir que je n'insère pas de valeurs en double dans ma table de faits pour ne pas avoir d'erreur d'intégrité référentielle?

J'ai essayé avec la déclaration suivante après cette requête:

EXCEPT 
SELECT * 
FROM [dbo].[FACT_TABLE] 

Mais je pense que ce n'est pas la meilleure approche pour cette ...

Quelqu'un at-il une autre alternative pour cela? Désolé mais je ne peux pas mettre la vraie colonne et les noms des tables ...

Merci!

+0

Comment définissez-vous vos doublons? si c'est l'ensemble de l'enregistrement, mettez toutes les colonnes comme une clé composite – LONG

Répondre

1

LEFT OUTER JOIN avec WHERE FT.Column IS NULL à la table d'information pour vous assurer ne pas insérer un document qui existe déjà.

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

En fait, le DISTINCT est redondant. Puisque vous êtes déjà en train de regrouper, vous ne pouvez pas obtenir de doublons. Je vais modifier la réponse pour l'enlever. –

0

INSERT INTO [dbo] [FACT_TABLE]

([A_id], [B_id ], [C_Id], [D_ID], [FACT_total], [FACT_average])

select a.A_id, a.B_id, a.C_id, a.D_id, a.FACT_total, a.FACT_average

de

( 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 

DE

[dbo].[staging_Area] a 

jointure

[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 

)a 

NOT EXISTS

( SELECT 1 à partir de B dbao.FACT_TABLE


B.A_id = A.A_id ET B.B_id = A.B_id et b.C_id = a.C_id et b.D_id = a.D_id

) 
+0

Vous devriez travailler sur le formatage, @alen - c'est pratiquement illisible. –