2015-04-23 21 views
6

2 tablo var. Birincisi fname (ilk ad), lname (soyadı) ve ikincisi, salutation (Mr, Dr etc), fname (ilk ad), mname (orta isim), lname (soyadı), benzersiz bir belirleyici içerir. ve bir tarih.SQL Server 2014 IN NOT IN

I Salutation, fname, mname, lname, diğer 2 tablolarda bilgilerden uid, added sonra damla ilk tablosunu içeren üçüncü bir tablo oluşturmak ve bu sütun kaldırma ikinci tablo yeniden yaratmak istiyoruz.

Bu benim ne var:

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 

Bu benim karıştı nerede:

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) 

birisi çalıştığını böylece son INSERT deyimi düzeltmek misiniz? WHERE kelime

  • sağındaki

      o sevmez
    1. Fname, Lname İlk birinden ilk o zaman ikinci tablodan eklemek gerekir mi?
  • cevap

    7

    Bir ilişkili alt sorgu not exists kullanabilirsiniz: Ben 2 olası durumları belirleyebilir, aşağıdaki yorum OP sağladığı yeni koşullara göre

    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) 
    

    Güncelleme

    , hangi kayıtta yer almalıdır:

    • var.ve lname eşleşmesi; Bir Salutation ve lname eşleşmesi var.

    yukarıdaki koşullara uyan sorgu aşağıdaki gibidir:

    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

    Bu yaklaşımın 1000'den fazla kaydı kaçırdığını tespit ediyorum. Hala bu öneriyle oynuyorum ama şansın yok. Tablo 2'nin bazı satırlarda bir fname değeri olduğunu, ancak başka bir ad içermediğini fark ettim.Bir fname varsa, lname ekleyin, eğer bir selamlama ve lname varsa, herhangi bir satır sadece Salutation'dan birine sahipse veya diğer 3 isim alanlarını serbest bırakan isimler bu sonucu eklemez. Yanıtlamak için bu küçük metin kutusuna sahip olmak da çok yararlı değildir. –

    +0

    @EssexMale: Cevabımı güncelledim, ancak ne aradığınızı% 100 gibi hissetmiyorum, bu yüzden orijinal yazılarınızı biraz daha ayrıntılı ve daha açık bir durum belirlemesiyle güncellemeniz gerektiğini düşünüyorum. – potashin

    0

    left join olarak:

    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

    açıklamada An veya sadece olabilir böylece açıklamada yalnızca bir sütun olabilir değil bu gibi kullanilir ( ) Çözüm mevcut değil veya diğer iki kullanımın size gösterdiği gibi sol birleştirmek olurdu. Sadece ingilimin neden işe yaramayacağını açıklayabileceğimi düşündüm.

    +0

    Merhaba Michelle, Sorduğum soruyu sormadan önce önerdiğin şeyi yaptım ama bana göre iyi değil çünkü WHERE sadece bir sütun alırken, buna karşı ihtiyacım var ve SQL sadece bir tanesi hakkında bir çeşit mesaj veriyor. WANE fname çalıştı, lname ... ve SQL inledi. Öneri için teşekkürler ama maalesef yardım etmiyor. Yapmaya çalıştığım şey, bir eklemede önerdiğin şeyi kullanmak, SOL JOIN yaklaşımı, sonra Silme ihtiyacım olan satırları olan bir Sıcaklık Tablosu yaratmak için bir Durum ama bunu kaydetmem gerekiyor ve o zamana kadar işe yaramadı oradan bir DELETE çalıştırın –