2017-09-20 5 views
0

複数のレコードを単一のクエリでテーブルに挿入しています。しかし、ここで私は重複レコードをスキップしています。私はそれらのレコードをスキップするのではなく、同じ構造を持つ別のテーブル(コピー可能)にそれらのコピーを挿入する必要があります。また、両方のアクティビティを1つのステートメントで実行する必要があります。つまりは、第二のテーブルに最初のテーブルと重複したレコードに挿入Postgresで複写を複写する複写インサートの複写を1つのクエリに挿入する

INSERT INTO manager.vin_manufacturer 
(SELECT * FROM(VALUES 
('935',' Citroën Brazil','Citroën'), 
('ABC', 'Toyota', 'Toyota'), 
('ZOM',' OM','OM') 
) as tmp (vin_manufacturer_id, manufacturer_desc, make_desc) 
WHERE NOT EXISTS (
SELECT 1 FROM manager.vin_manufacturer m where m.vin_manufacturer_id = 
tmp.vin_manufacturer_id) 
) 
+0

条件がネゲートされた2番目の 'insert'ステートメントが必要です(また、完全なselectステートメントのまわりの括弧はまったく役に立たない) –

+0

[データを別のテーブルにコピーする](https://stackoverflow.com)/questions/13237623/copy-data-into-another-table) – serakfalcon

答えて

1

あなたは、単一のステートメントでは、しかし、あなたはここで、(単に否定条件で)既存の行を検出条件繰り返す必要があることを行うことができます。

with tmp (vin_manufacturer_id, manufacturer_desc, make_desc) as (
    VALUES 
    ('935',' Citroën Brazil','Citroën'), 
    ('ABC', 'Toyota', 'Toyota'), 
    ('ZOM',' OM','OM') 
), inserted as (
    -- insert but skip duplicates 
    INSERT INTO manager.vin_manufacturer (vin_manufacturer_id, manufacturer_desc, make_desc) 
    SELECT vin_manufacturer_id, manufacturer_desc, make_desc 
    FROM tmp 
    WHERE NOT EXISTS (SELECT 1 
        FROM manager.vin_manufacturer m 
        where m.vin_manufacturer_id = tmp.vin_manufacturer_id) 
    returning * -- return all inserted rows 
) 
-- insert the duplicates into a different table 
insert into duplicates_table (vin_manufacturer_id, manufacturer_desc, make_desc) 
select vin_manufacturer_id, manufacturer_desc, make_desc 
from tmp 
WHERE NOT EXISTS (select * 
        from inserted i 
        where i.vin_manufacturer_id = tmp.vin_manufacturer_id) 
+0

これは私が探しているものです...素晴らしい –

関連する問題