Ссылочная целостность внешнего ключа в таблицах фактов - 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] 

Но я думаю, что это не лучший подход для этого...

У кого-нибудь есть другая альтернатива для этого? Извините, но я не могу поставить настоящие имена столбцов и таблиц...

Спасибо!

2 ответа

Решение

LEFT OUTER JOIN с WHERE FT.Column IS NULL в таблицу фактов, чтобы убедиться, что вы не вставляете запись, которая уже существует:

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

INSERT INTO [dbo]. [FACT_TABLE]

([A_id], [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

от

(ВЫБРАТЬ

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

ВНУТРЕННЕЕ СОЕДИНЕНИЕ

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

ВНУТРЕННЕЕ СОЕДИНЕНИЕ

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

INNER JOIN [dbo].[DIM_C] d ON a.[C_id] = d.C_id

ВНУТРЕННЕЕ СОЕДИНЕНИЕ

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

ГРУППА ПО

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

)a 

где

НЕ СУЩЕСТВУЕТ

(ВЫБЕРИТЕ 1 ОТ dbao.FACT_TABLE B

ГДЕ
B.A_id = A.A_id И B.B_id = A.B_id и b.C_id = a.C_id и b.D_id = a.D_id

   )
Другие вопросы по тегам