2016-04-13 19 views
0

3rhテーブルの外部キーを使用して、あるテーブルから別のテーブルにデータを挿入できないという問題が発生しました。データをユニークに保ちながらSQL:外部キーを持つテーブルへのステージングテーブル

SQL diagram

まず私は、ステージング表から私の[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の中間に取り出してしまった重複のものされて行方不明。

FoutIdのExtraInfoに関するデータを含む2番目のステージングテーブルが作成されましたが、これらには重複が含まれています。私がしようとしているのは、Foutテーブル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と重複したレコードを削除する必要があります。

最初の式を変更しようとしました。なぜなら、uがどの列をカウントするかを選択できる別個の行を許可するからです。これは大成功ではありませんでした。

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)) 

FOREIGN KEY制約 "FK_ExtraInfo_Fouten" と競合INSERT文。競合はデータベース "TestDatabase"、テーブル "dbo.Fouten"、列 'FoutId'で発生しました。ステートメントには が終了しました。

[Fouten]テーブル内にリストされていないFoutIdを含む行を追加しようとしているためです。私の質問の意味は間違っていますが、何が分かりませんか。

これを解決する方法はありますか?すべての助けが大いに評価されます!

答えて

0

見つけた!私のクエリはちょっとした変更が必要です。

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 
       ) 
関連する問題