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

Esta consulta sólo toma los datos de los datos del cliente (Tabla 1) y de insertarlo en otra tabla2 (account_details)restricción de violación de clave primaria

cuando esta consulta es despedido por primera vez que trabaja muy bien

pero cuando se dispara por segunda vez, muestra el error Violación de la restricción PRIMARY KEY 'PK_account_details'. No se puede insertar la clave duplicada en el objeto 'dbo.account_details'.

alguna idea para omitir datos existentes en (account_details) tabla1 y la inserción de nuevos datos en la siguiente fila

+1

lo que es la clave principal? –

+0

customer_id en la tabla customer_details y account_number en la tabla de detalles de la cuenta –

Respuesta

5

El uso de un LEFT JOIN le permite excluir todas las filas que ya están presentes en la tabla account details. Una alternativa a esto (y probablemente incluso más rápido) es usar un NOT EXISTS.

utilizando 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   

utilizando una es la clave principal 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 por mencionar NOT EXISTS. Un ejemplo sería bueno también. –

+0

NO EXISTE ejemplo agregado. –

4

asumiendo ACCOUNT_NUMBER, esto debería funcionar

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, me ganaste por unos segundos ... – Sage

+0

Ya estaba pensando, * esto es espeluznante *;) –

+2

+1 por cierto (7 ... no 2 ... no quedan 556 caracteres) –

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 
Cuestiones relacionadas