2015-04-23 14 views
6

Ci sono 2 tabelle. Il primo ha fname (nome), lname (cognome) e il secondo ha molte colonne tra cui: salutation (Mr, Dr ecc.), fname (nome), mname (secondo nome), lname (cognome), un identificativo univoco e una data.SQL Server 2014 Inserisci dove NON IN

desidero creare una terza tabella contenente la Salutation, fname, mname, lname, uid, added dalle informazioni nelle altre 2 tavoli poi cadrà la prima tabella e ricreare la seconda tabella rimuovendo le colonne.

Questo è quello che ho:

CREATE TABLE MyTable 
(
    Id int IDENTITY (1, 1) PRIMARY KEY, 
    Salutation varchar(20) NULL DEFAULT (NULL), 
    Fname varchar(30) NOT NULL, 
    Mname varchar(30) NULL DEFAULT (NULL), 
    Lname varchar(30) NOT NULL, 
    Uid uniqueidentifier NULL DEFAULT (NULL), 
    Added Date NOT NULL DEFAULT (getdate()) 
); 

INSERT INTO MyTable (Fname, LName) 
    SELECT Fname, Lname 
    FROM TABLE1 

Questo è dove mi sono confuso:

INSERT INTO MyTable (Salutation, Fname, Mname, LName, Uid, Added) 
    SELECT 
     Salutation, Fname, Mname, LName, Uid, Added 
    FROM 
     Table2 
    WHERE 
     Fname, Lname NOT IN (SELECT Fname, Lname FROM Table1) 

Qualcuno può correggere l'ultima INSERT affermazione in modo che funzioni?

  1. non piace Fname, Lname alla destra della parola WHERE
  2. Devo inserire dalla seconda tabella prima poi dal primo?

risposta

7

È possibile utilizzare not exists con una subquery correlata:

insert into MyTable (Salutation, Fname, Mname, LName, Uid, Added) 
select Salutation, Fname, Mname, LName, Uid, Added from Table2 t 
where not exists (select 1 from Table1 where Fname = t.Fname and Lname = t.Lname) 

Aggiornamento

In base alle nuove condizioni, fornita dal PO nei commenti qui sotto, posso determinare 2 possibili situazioni in quale record dovrebbe essere incluso:

  • c'è un fname e lname partita;
  • c'è una corrispondenza Salutation e lname.

La query corrispondente alle condizioni di cui sopra è inferiore:

insert into MyTable (Salutation, Fname, Mname, LName, Uid, Added) 
select Salutation, Fname, Mname, LName, Uid, Added from Table2 t 
where not exists (
    select 1 
    from Table1 
    where Lname = t.Lname and 
     (Fname = t.Fname or Salutation = t.Salutation) 
) 
+0

Sto scoprendo che questo approccio manca oltre 1000 record. Sto ancora giocando con questo tuo suggerimento ma ancora senza fortuna. Ho notato che Table2 ha un valore fname in alcune righe ma nessun altro nome quindi non desidero includerlo.Se ha un fname, lname lo aggiunge, se ha un saluto e lname lo include, se una riga ha solo uno dei Salutation o i nomi che lasciano gli altri 3 campi di nome liberi, non voglio che il risultato sia aggiunto. Avere questa piccola casella di testo per rispondere non è molto utile neanche. –

+0

@EssexMale: ho aggiornato la mia risposta, tuttavia non mi sembra che sia al 100% quello che stai cercando, quindi penso che dovresti aggiornare il tuo post originale con un po 'più di elaborazione e una più chiara determinazione delle condizioni. – potashin

0

Con left join:

INSERT INTO MyTable (Salutation, Fname, Mname, LName, Uid, Added) 
SELECT t2.Salutation, t2.Fname, t2.Mname, t2.LName, t2.Uid, t2.Added FROM Table2 t2 
LEFT JOIN Table1 t1 on t1.Fname = t2.Fname AND t1.Lname = t2.Lname 
WHERE t1.ID IS NULL 
0

An in istruzione o una non dichiarazione può avere solo una colonna quindi potrebbe essere solo usato in questo modo

INSERT INTO MyTable (Salutation, Fname, Mname, LName, Uid, Added) 
SELECT Salutation, Fname, Mname, LName, Uid, Added FROM Table2 
WHERE Fname NOT IN (SELECT Fname FROM Table1)' 

Una migliore la soluzione sarebbe quella di utilizzare non esiste o il join di sinistra come gli altri due usi ha mostrato. Ho solo pensato di spiegare perché il non in statement non avrebbe funzionato.

+0

Ciao Michelle, Prima di porre la domanda ho fatto quello che mi hai suggerito ma non mi va bene perché il WHERE prende solo una colonna mentre io ne ho bisogno contro i due e SQL dà una sorta di messaggio che può essere usato solo uno senza Exists. Ho provato WHERE fname, lname ... e SQL si lamentava. Grazie per il suggerimento, ma sfortunatamente non aiuta. Quello che sto cercando di fare è usare quello che hai suggerito su un inserto, l'approccio LEFT JOIN e poi un caso per creare una tabella temporanea con le righe che devo cancellare, ma devo essere in grado di salvarlo e non l'ho risolto fino a quel momento eseguire un DELETE da lì –