2015-04-23 15 views
6

Dostępne są 2 tabele. Pierwszy ma fname (imię), lname (nazwisko), a drugi ma wiele kolumn, w tym: salutation (Pan, Dr itp.), fname (imię), mname (drugie imię), lname (nazwisko), unikalnyidentyfikator i datę.Serwer SQL 2014 Insert IN NOT IN

Chciałbym utworzyć trzecią tabelę zawierającą Salutation, fname, mname, lname, uid, added od informacji zawartych w pozostałych 2 stoły potem spadnie pierwszej tabeli i ponownie utworzyć drugą tabelę Usunięcie tych kolumn.

To jest to, co mam:

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 

To gdzie ja mylić:

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) 

Czy ktoś mógłby poprawić ostatni INSERT oświadczenie, że tak to działa?

  1. nie lubi Fname, Lname z prawej strony WHERE słowa
  2. powinienem wstawić z drugiej tabeli pierwszej następnie od pierwszego?

Odpowiedz

7

Można użyć not exists z podzapytanie skorelowane:

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) 

Aktualizacji

Zgodnie z nowymi warunkami, dostarczonych przez OP w komentarzach poniżej, można ustalić, 2 możliwe sytuacje w którym należy uwzględnić rekord:

  • pod numerem fname i lname dopasowanie;
  • Istnieje dopasowanie Salutation i lname.

Zapytanie dopasowanie warunków brzmi następująco:

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

Stwierdzam, że takie podejście pomija ponad 1000 rekordów. Nadal gram z twoją sugestią, ale bez powodzenia. Zauważyłem, że Table2 ma wartość fname w niektórych wierszach, ale nie ma innej nazwy, więc nie chcę jej dodawać.Jeśli ma nazwę fname, lname dodaj ją, jeśli ma zwrot grzecznościowy i lname to ją uwzględni, jeśli dowolny wiersz ma tylko jeden z pozdrowień lub nazwy pozostawiając pozostałe 3 pola nazw za darmo, nie chcę tego wyniku dodanego. Posiadanie tego małego pola tekstowego do odpowiedzi również nie jest zbyt pomocne. –

+0

@EssexMale: Zaktualizowałem swoją odpowiedź, jednak nie wydaje mi się, aby było to w 100% to, czego szukasz, więc myślę, że powinieneś zaktualizować swój pierwotny post z nieco większym opracowaniem i wyraźniejszym określeniem stanu. – potashin

0

Z 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 w rachunku lub nie w rachunku może mieć tylko jedną kolumnę, więc to może być tylko używane w ten sposób:

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

Lepsze rozwiązaniem byłoby nieistniejące lub lewe sprzężenie, tak jak pokazały to dwa pozostałe zastosowania. Pomyślałem tylko, że wytłumaczę, dlaczego nie w oświadczeniu nie zadziała.

+0

Cześć Michelle, Zanim zadałem pytanie, zrobiłem to, co zasugerowałeś, ale to nie jest dla mnie dobre, ponieważ WHERE zajmuje tylko jedną kolumnę, podczas gdy ja potrzebuję tego przeciwko dwóm, a SQL daje jakąś wiadomość o tym, że tylko jeden może być użyty bez Exist. Próbowałem WHERE fname, lname ... i SQL jęknął. Dzięki za sugestię, ale niestety to nie pomaga. Próbuję użyć tego, co zasugerowałeś na jednej wstawce, podejścia LEFT JOIN, a następnie przypadku, aby utworzyć tabelę tymczasową z wierszami, które muszę usunąć, ale muszę być w stanie ją zapisać i nie przetworzyć tego na razie. uruchom DELETE stamtąd –