2

このトピックは、ストアドプロシージャを使用して、SQL Serverのあるテーブルから別のテーブルに欠落している行をコピーすることに関連していますが、今回の問題はもう少し複雑です。

同一の異なるデータベース(同じサーバー上)にテーブルを作成する必要があります。左側のデータベーステーブルから右側のデータベーステーブルにデータ行を転送する必要がありますが、右側のデータベーステーブルにまだない行のみを転送したいと思います。

私のテーブルには4つの主キーがあります。画像を参照してください

ここに画像の説明を入力してください

このようなものを使いたい

insert into [EXTERN_EPI6R2].[dbo].[tblBigTableReference]
select * from [EXTERN].[dbo].[tblBigTableReference]
where (
 pkId not in (select pkId 
  from [EXTERN_EPI6R2].[dbo].[tblBigTableReference]) 
 and PropertyName not in (select PropertyName 
  from [EXTERN_EPI6R2].[dbo].[tblBigTableReference]) 
 and IsKey not in (select IsKey 
  from [EXTERN_EPI6R2].[dbo].[tblBigTableReference])
 and [Index] not in (select [Index] 
  from [EXTERN_EPI6R2].[dbo].[tblBigTableReference])
)

しかし、条件の積み重ねが何らかの形で間違っているため、それは機能しません。

SQL Server2008R2を使用しています

4

1 に答える 1

4

さまざまな条件が異なる行で一致する可能性があるため、クエリは正しくありません。

insert into [EXTERN_EPI6R2].[dbo].[tblBigTableReference]
select * from [EXTERN].[dbo].[tblBigTableReference] AS s
where NOT EXISTS 
(
  SELECT 1 FROM [EXTERN_EPI6R2].[dbo].[tblBigTableReference] AS d
  WHERE d.pkId = s.pkId 
  AND d.PropertyName = s.PropertyName
  AND d.IsKey = s.IsKey
  AND d.[Index] = s.[Index] -- terrible column name
);

しかし、ここで疑問が生じます。なぜこれら 4 つの列すべてがキーの一部なのですか? 十分ではpkIdありませんか?そうでない場合は、奇妙で間違った名前が付けられています。

于 2012-06-04T17:49:03.623 に答える