2017-05-24 25 views
0

私は既存のテーブル(tbl01)にレコードが存在しない一時テーブル(temp)から挿入する方法を理解しようとしていますテーブル(tbl01)。私はそれが理にかなったことを願う私は基本的に、テーブルの最後の更新以降に発生したレコードでテーブルを更新しようとしています。ここに私のコードは、これまでのところです:レコードが存在しない別のテーブルからテーブルに挿入

insert into tbl01 
(sale_store, sale_dt, sale_register, sale_trans) 
select distinct 
sale_store, sale_dt, sale_register, sale_trans 
from temp 
where NOT EXISTS (select * from tbl01) 

私がいる問題は、それが実行されるということですが、テーブルに任意の新しいレコードを入れていません - 新しいレコードの多くがあるべきです。私はそれが何か小さいと愚かな私は行方不明だと確信しています。私はこの記事を私のガイドとして使いました:How to avoid duplicates in INSERT INTO SELECT query in SQL Server?

ありがとうございます!

+0

「tbl01」の別のレコードをどのように決定しますか?それは 'sales_store'か複数のフィールドですか? 'NOT EXISTS(SELECT ...)'はSELECT文を実行し、レコードがあれば 'NOT EXISTS'が失敗するので、相関サブクエリが必要になるか、 ' NOT IN(SELECT FROM ...)を使う必要があります。 ) ' – JNevill

+0

これらの4つのフィールドが一緒になって「別個の」レコードを作成します。したがって、これらのフィールドの4つすべてを次のようなものとして含める必要があります。 ここでは存在しません(select sale_store、sale_dt、sale_register、sale_trans from tbl01 – DJDJ23

+1

ターゲットがSETテーブルとして作成され、 WHEREがないINSERT/SELECT、重複した行は静かにSETテーブルによって破棄されます – dnoeth

答えて

3

問題は、内部クエリが一時テーブルに依存しないことです。基本的に、あなたが書いたのは、 "tbl01にレコードが存在しない場合には、tbl01に挿入"でした。これを修正するには、existsの中のクエリにwhere句を追加する必要があります。

insert into tbl01 
(sale_store, sale_dt, sale_register, sale_trans) 
select distinct 
sale_store, sale_dt, sale_register, sale_trans 
from temp 
where NOT EXISTS (
    select * 
    from tbl01 
    where temp.sale_store = tbl01.sale_store 
    and temp.sale_dt = tbl01.sale_dt 
    and temp.sale_register = tbl01.sale_register 
    and temp.sale_trans = tbl01.sale_trans) 
+0

質問のコメントに基づいて主キーはすべて4つのフィールドです – JNevill

+0

@JNevillありがとう、それに応じて私の答えを編集 –

+0

ありがとう、Zohar!キーが存在しないことを確認することに意味がありました。 – DJDJ23

関連する問題