0

2つの主キーを持つテーブルがある場合:

CREATE TABLE [AttributeMap](
[intParentAttributeId] [bigint] NOT NULL,
[intChildAttributeId] [bigint] NOT NULL,
    [datCreatedDate] [datetime] NOT NULL
  CONSTRAINT [PK_AttributeMap] PRIMARY KEY CLUSTERED 
 ( 
   [intParentAttributeId] ASC,
    [intChildAttributeId] ASC
 )

挿入/選択ステートメントを実行してテーブルにデータを追加する場合、両方のキーに違反しないようにデータを制限するにはどうすればよいですか?

したがって、これを上の表に挿入すると、次のようになります。

INSERT INTO [AttributeMap] VALUES (1, 1, getdate())
INSERT INTO [AttributeMap] VALUES (1, 2, getdate())
INSERT INTO [AttributeMap] VALUES (1, 3, getdate())
INSERT INTO [AttributeMap] VALUES (2, 1, getdate())

キーに違反せずにこのクエリを実行するにはどうすればよいですか?

declare table @temp (intParent int, intChild int)
insert into @temp (1, 1)
insert into @temp (1, 2)
insert into @temp (4, 4)
insert into @temp (5, 5)

 insert into AttributeMap (intParentAttributeId, intChildAttributeId, datCreatedDate)
  select intParent, intChild, getDate()
 from @temp

したがって、AttributeMapは、値4、4、 "date"と5、5"date"の2つの新しい行で終わるはずです。わかる?

乾杯、マット

4

2 に答える 2

3

EXCEPT

EXCEPTオペランドの左側のクエリから、右側のクエリからも返されない個別の値を返します。

これを試して:

insert into AttributeMap (intParentAttributeId, intChildAttributeId, datCreatedDate)
Select temp.intParent, temp.intChild, getDate()
FROM 
(select intParent, intChild
from @temp 
EXCEPT 
select intParentAttributeId, intChildAttributeId
from AttributeMap) as temp
于 2012-05-28T11:54:37.340 に答える
1

キーがすでに存在するかどうかを手動で確認し、存在しない場合にのみ挿入する必要があります。

 insert into AttributeMap (intParentAttributeId, intChildAttributeId, datCreatedDate)
 select intParent, intChild, getDate()
   from @temp t
  where not exists (select null
                      from AttributeMap
                     where AttributeMap.intParent = t.intParent
                       and AttributeMap.intChild = t.intChild
                   )
于 2012-05-28T11:48:05.217 に答える