C# SQL:使用外键将表转移到表
我遇到了一个问题,无法使用3rh表的外键将数据从一个表插入到另一个表。同时保持数据的唯一性 首先,我从暂存表填充我的[Fouten]表。此查询筛选器复制并存储其余行,从大约144.000行到66.580行。这是一个完美的工作方式,就像它应该的那样-C# SQL:使用外键将表转移到表,c#,sql,sql-server,foreign-keys,sql-insert,C#,Sql,Sql Server,Foreign Keys,Sql Insert,我遇到了一个问题,无法使用3rh表的外键将数据从一个表插入到另一个表。同时保持数据的唯一性 首先,我从暂存表填充我的[Fouten]表。此查询筛选器复制并存储其余行,从大约144.000行到66.580行。这是一个完美的工作方式,就像它应该的那样- INSERT INTO [TestDatabase].[dbo].Fouten (FoutId, Datum, Time, FoutCode,Omschrijving,TreinId, Module) SELECT st.FoutId, st.Da
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的中间缺失的是被移除的复制品
我现在得到了第二个暂存表,其中包含关于FoutId命名的ExtraInfo的数据,但这些表仍然包含重复项。我试图做的是将所有记录插入到表中,该表包含基于Fout tables FoutId列上的匹配的限制,从而过滤掉重复的记录。但是在ExtraInfo表中,FoutId不能有与值组合的重复记录
例如:
[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语句与外键约束冲突
“FK_ExtraInfo_Fouten”。数据库中发生冲突
“TestDatabase”,表“dbo.Fouten”,列“FoutId”。该声明已经发布
已经终止
我假设这是因为它试图添加一行,其中包含[Fouten]表中未列出的FoutId。意思是我的查询中的某些内容出错,但无法找出原因
有人知道怎么解决这个问题吗?非常感谢所有的帮助 找到了!我的查询只需要一些更改
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
)