【问题标题】:SQL: staging table to table with foreign keySQL:使用外键将表暂存到表
【发布时间】:2016-04-13 08:38:40
【问题描述】:

我遇到了一个问题,我无法使用 3rh 表的外键将数据从一个表插入到另一个表。同时保持数据的唯一性。

首先,我从一个临时表填充我的 [Fouten] 表。此查询过滤器复制并存储剩余的行,从大约 144.000 行变为 66.580 行。这完美地工作,因为它应该 -

INSERT INTO [TestDatabase].[dbo].Fouten (FoutId, Datum, Time, FoutCode,Omschrijving,TreinId, Module)
SELECT st.FoutId, st.Datum, st.Time, st.FoutCode, st.Omschrijving, st.TreinId, st.Module
FROM ( 
     SELECT FoutId, 
            Datum, 
            Time, 
            FoutCode,
            Omschrijving,
            TreinId,
            Module,
            row_number() over (partition by TreinId, Datum, Time, FoutCode order by TreinId, Datum, Time, FoutCode) as rn
     FROM [TestDatabase].[dbo].foutenTemp ) as st
WHERE st.rn = 1
AND NOT EXISTS (SELECT 1 
                FROM [TestDatabase].[dbo].Fouten t2
                WHERE t2.TreinId = st.TreinId 
                  AND t2.Datum = st.Datum
                  AND t2.Time = st.Time
                  AND t2.FoutCode = st.FoutCode)

输出:

[Fouten]
FoutId  Datum   Time            FoutCode    Omschrijving        Module          TreinId
4   2009-11-29  08:59:10.070    01-00-26    Overgang AC naar DC ACTRL1_A9120110 1 
5   2009-11-29  21:10:35.612    01-00-27    Overgang DC naar AC ACTRL1_A9120110 1 
6   2009-11-30  12:29:56.638    01-00-26    Overgang AC naar DC ACTRL1_A9120110 1 
10  2009-12-01  06:17:57.048    01-00-26    Overgang AC naar DC ACTRL1_A9120110 1 
15  2009-12-01  05:34:06.779    06-00-46    Def. of incoh. richtwaarde voor blending    ACTRL1_A9120110 1

中间缺少的 FoutId 是已删除的重复项。

我现在得到了第二个临时表,其中包含有关名为 ExtraInfo 的 FoutId 的数据,但这些仍然包含重复项。我想要做的是将所有记录插入到包含基于 Fout 表 FoutId 列匹配的限制的表中,从而过滤掉重复的记录。但在 ExtraInfo 表中,FoutId 不能与 Value 相结合的重复记录

例如:

[ExtraInfo]
FoutId  Value
3   etat_x_convoi_ok = 0x01 '' 
3   old_mode_ac_dc = 0 
3   ICO_m_a_pmcf = 0 
3   APP_mode_ac_dc = 0x01 '' 
4   etat_x_convoi_ok = 0x01 '' 
4   old_mode_ac_dc = 16777216 
4   old_mode_ac_dc = 16777216 
4   ICO_m_a_pmcf = 0 
4   APP_mode_ac_dc = 0x00 '
4   APP_mode_ac_dc = 0x00 '

应该变成:

[ExtraInfo]
FoutId  Value
4   etat_x_convoi_ok = 0x01 '' 
4   old_mode_ac_dc = 16777216 
4   ICO_m_a_pmcf = 0 
4   APP_mode_ac_dc = 0x00 '

由于 FoutId 必须存在于 [Fouten] 表中,因此应删除不包含 4 的 FoutId,同时还要删除与该值组合的 4 的任何重复记录。

我尝试改变第一个表达式,因为它允许不同的行,您可以在其中选择哪些列计数。这不是很成功。

INSERT INTO [TestDatabase].[dbo].ExtraInfo (FoutId, Value)
SELECT a.FoutId, a.Value
FROM ( 
     SELECT FoutId, 
            Value,
            row_number() over (partition by FoutId, Value order by FoutId, Value) as rn
     FROM [TestDatabase].[dbo].extrainfoTemp ) as a
WHERE a.rn = 1
AND NOT EXISTS (SELECT 1
                FROM [TestDatabase].[dbo].ExtraInfo t2
                WHERE t2.FoutId in (
                        select t1.FoutId from [TestDatabase].[dbo].Fouten t1 where t1.FoutId = t2.FoutId))

INSERT 语句与 FOREIGN KEY 约束冲突 “FK_ExtraInfo_Fouten”。数据库发生冲突 “TestDatabase”,表“dbo.Fouten”,列“FoutId”。该声明有 被终止了。

我假设这是因为它尝试添加没有在 [Fouten] 表中列出的 FoutId 的行。表示我的查询中有问题但不知道是什么。

有人知道如何解决这个问题吗?非常感谢所有帮助!

【问题讨论】:

    标签: c# sql sql-server foreign-keys sql-insert


    【解决方案1】:

    找到了!我的查询只需要一些更改。

    INSERT INTO [TestDatabase].[dbo].ExtraInfo (FoutId, Value)
    SELECT a.FoutId, a.Value
    FROM ( 
         SELECT FoutId, 
                Value,
                row_number() over (partition by FoutId, Value order by FoutId, Value) as rn
         FROM [TestDatabase].[dbo].extrainfoTemp ) as a
    WHERE a.rn = 1 and a.FoutId in (select b.FoutId from [TestDatabase].[dbo].Fouten as b where a.FoutId = b.FoutId)
    AND NOT EXISTS (SELECT 1 
                    FROM [TestDatabase].[dbo].ExtraInfo t2
                    WHERE t2.FoutId = a.FoutId 
                      AND t2.Value = a.Value
                      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      相关资源
      最近更新 更多