2015-04-23 21 views
6

Es gibt 2 Tabellen. Die erste hat fname (Vorname), lname (Nachname) und die zweite hat viele Spalten einschließlich: salutation (Herr, Dr. etc), fname (Vorname), mname (zweiter Vorname), lname (Nachname), eine Uniqueidentifier und ein Datum.SQL Server 2014 Einfügen wo nicht IN

Ich mag eine dritte Tabelle, die die Salutation, fname, mname, lname, uid, added aus den Informationen in den anderen zwei Tabellen enthalten, erstellen, dann werde ich die erste Tabelle löschen und neu erstellen die zweite Tabelle die Spalten zu entfernen.

Das ist, was ich habe:

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 

Dies ist, wo ich bin verwirrt:

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) 

Kann jemand bitte die letzte INSERT Aussage korrigieren, damit es funktioniert?

  1. es nicht wie Fname, Lname rechts von dem WHERE Wort
  2. Sollte ich aus der zweiten Tabelle einfügen zuerst, dann von dem ersten?

Antwort

7

Sie können not exists mit einer korrelierten Unterabfrage verwenden:

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) 

aktualisiert

Nach den neuen Bedingungen, unter der OP in den Kommentaren versehen, kann ich zwei mögliche Situationen bestimmen in welchem ​​Datensatz sollte enthalten sein:

  • gibt es eine fname und lname übereinstimmen;
  • gibt es eine Salutation und lname übereinstimmen.

Die Abfrage, um die oben genannten Bedingungen passend ist unter:

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

Ich finde, dass dieser Ansatz über 1000 Datensätze verfehlt. Ich spiele immer noch mit diesem Vorschlag von dir, aber noch kein Glück. Ich habe bemerkt, dass Table2 in einigen Zeilen einen fname-Wert hat, aber keinen anderen Namen, daher möchte ich ihn nicht einschließen.Wenn es einen fname hat, lname fügt es hinzu, wenn es eine Anrede hat und lname es enthält, wenn irgendeine Zeile nur eine der Anrede hat oder die Namen die anderen 3 Namensfelder frei lassen, will ich nicht, dass dieses Ergebnis hinzugefügt wird. Dieses kleine Textfeld zu beantworten ist auch nicht sehr hilfreich. –

+0

@EssexMale: Ich habe meine Antwort aktualisiert, aber ich habe nicht das Gefühl, dass es zu 100% das ist, wonach du suchst, also denke ich, dass du deinen ursprünglichen Beitrag mit ein wenig mehr Ausarbeitung und klareren Bedingungsbestimmungen aktualisieren solltest. – potashin

0

Mit 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

Ein in Anweisung oder eine nicht in Anweisung kann nur eine Spalte hat, so dass es nur sein könnte verwendet so

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)' 

Ein besser Lösung wäre zu verwenden nicht vorhanden oder der linke Join wie die beiden anderen Anwendungen zeigte Ihnen. Ich dachte nur, ich würde erklären, warum das nicht in der Aussage nicht funktionieren würde.

+0

Hallo Michelle, Bevor ich die Frage gestellt habe, habe ich getan, was Sie vorgeschlagen haben, aber es ist nicht gut für mich, weil das WHERE nur eine Spalte braucht, während ich es gegen die beiden brauche und SQL irgendeine Art von Nachricht über nur eins ohne Exists geben kann. Ich versuchte WHERE fname, lname ... und SQL stöhnte. Danke für den Vorschlag, aber leider hilft es nicht. Was ich versuche zu tun ist, was Sie vorgeschlagen, auf einem Einsatz, der LINKE JOIN-Ansatz dann ein Fall, um eine Temp-Tabelle mit Zeilen zu erstellen, die ich löschen muss, aber ich muss in der Lage sein, es zu speichern und nicht so weit dann funktioniert Führen Sie von dort ein DELETE aus –