2010-10-01 28 views
5
string sqlInsert = "Insert into account_details(
    account_number, 
    account_type, 
    transfer_access_code, 
    account_balance, 
    customer_id) 
SELECT 
    account_number, 
    account_type, 
    transfer_access_code, 
    account_balance, 
    customer_id 
from customer_details"; 

Bu sorgu sadece diğer tablo2 müşteri ayrıntıları (Tablo 1) ve insert yıllardan bu verileri (account_details) alır bu sorgu ilk kez ateş sorunsuz çalışıyor edilirBirincil anahtar ihlali kısıtlaması

ama ikinci kez tetiklendiğinde hata gösterir PRIMARY KEY kısıtlaması 'PK_account_details' ihlali. 'Dbo.account_details' nesnesinde yinelenen anahtar eklenemiyor.

bir fikrin

bir LEFT JOIN Zaten account details tabloda mevcut tüm satırları hariç tutmak için izin verir (account_details) tablo1 de mevcut veriler ve kullanma sonraki satıra

+1

çalışması gerekir? –

+0

customer_id customer_details tablosunda ve account_number hesap ayrıntıları tablosunda –

cevap

5

yeni veri ekleme, atlamak için. Buna bir alternatif (ve muhtemelen daha da hızlı) bir NOT EXISTS kullanıyor. Bir NOT EXISTS

INSERT INTO account_details (
    account_number 
    , account_type 
    , transfer_access_code 
    , account_balance 
    , customer_id) 
SELECT account_number 
     , account_type 
     , transfer_access_code 
     , account_balance 
     , customer_id 
FROM customer_details cd 
WHERE NOT EXISTS (
      SELECT * 
      FROM  account_details 
      WHERE account_number = cd.account_number) 
+0

+1 SORUN DEĞİLDİR. Bir örnek de iyi olurdu. –

+0

DEĞİL Örnekler eklendi. –

4

varsayarak ACCOUNT_NUMBER olan birincil anahtarı kullanarak bir LEFT JOIN

INSERT INTO account_details (
    account_number 
    , account_type 
    , transfer_access_code 
    , account_balance 
    , customer_id) 
SELECT account_number 
     , account_type 
     , transfer_access_code 
     , account_balance 
     , customer_id 
FROM customer_details cd 
     LEFT OUTER JOIN account_details ad ON ad.Account_number = cd.account_number 
WHERE ad.account_number IS NULL   

kullanılarak

, bu birincil anahtar budur

string sqlInsert = "Insert into account_details(
    account_number, 
    account_type, 
    transfer_access_code, 
    account_balance, 
    customer_id) 
SELECT 
    cd.account_number, 
    cd.account_type, 
    cd.transfer_access_code, 
    cd.account_balance, 
    cd.customer_id 
from customer_details cd 
left outer join account_details ad 
    on cd.account_number = ad.account_number 
where ad.account_number is NULL"; 
+1

ahh, @Lieven, beni bir kaç saniyede yen ... – Sage

+0

Zaten düşünüyordum, * bu ürpertici *;) –

+2

+1 btw (7 ... hayır 2 ... hayır 556 karakter kaldı) –

0
INSERT INTO account_details (ad.account_number, ad.account_type, 
    ad.transfer_access_code, ad.account_balance, ad.customer_id) 
SELECT cd.account_number, cd.account_type, 
    cd.transfer_access_code, cd.account_balance, cd.customer_id 
FROM customer_details cd 
LEFT OUTER JOIN account_details ad 
    ON cd.account_number = ad.account_number 
WHERE ad.account_number is NULL 
İlgili konular