2010-10-01 23 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"; 

Questa query richiede solo i dati da dati del cliente (Tabella 1) e inserire di in altri table2 (account_details)vincolo di violazione di chiave primaria

quando questa query viene licenziato per la prima volta funziona bene

ma quando viene sparato una seconda volta mostra l'errore Violazione del vincolo PRIMARY KEY "PK_account_details". Impossibile inserire la chiave duplicata nell'oggetto "dbo.account_details".

alcuna idea di omettere dati esistenti (account_details) tabla1 ed inserendo i nuovi dati nella riga successiva

+1

qual è la chiave primaria? –

+0

customer_id nella tabella customer_details e numero_ccount nella tabella dei dettagli dell'account –

risposta

5

Utilizzando una LEFT JOIN permette di escludere tutte le righe che sono già presenti nella tabella account details. Un'alternativa a questo (e probabilmente anche più veloce) sta usando un NOT EXISTS.

utilizzando un 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   

utilizzando una è la chiave primaria 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 per menzionare NOT EXISTS. Un esempio sarebbe anche buono. –

+0

Aggiunto ESISTE NON ESEGUITO. –

4

assumendo ACCOUNT_NUMBER, questo dovrebbe funzionare

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, mi hai battuto di pochi secondi ... – Sage

+0

Stavo già pensando, * questo è inquietante *;) –

+2

+1 btw (7 ... no 2 ... no 556 caratteri rimanenti) –

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 
Problemi correlati