2012-07-30 20 views
12

Tablo T1'deki tüm kayıtları seçmek istiyorum, burada A ve B sütunlarındaki değerlerin T2 tablosundaki C ve D sütunları için eşleşen bir birleşimi yoktur. mysql “Where not in” using two columns olarakT-SQL "İçinde değil" iki sütun kullanarak

I formu T1 A, B seçmek başarmak için nasıl okuyabilir burada (A, B) değil (C, T2 D SEÇ), ama bu beni sonuçlanan T-SQL başarısız "Yanlış sözdizimi yanında ','.".

Peki bunu nasıl yaparım?

cevap

22

bir bağıntılı alt sorgu kullanın:

... 
WHERE 
    NOT EXISTS (
    SELECT * FROM SecondaryTable WHERE c = FirstTable.a AND d = FirstTable.b 
) 

(c, d) üzerinde SecondaryTable bir bileşik endeksi olmadığına emin olun, o çok sayıda tablo içermiyor sürece.

+0

Bu mükemmel bir seçenektir! – RolandoCC

+0

Çalışmıyor. FirstTable, ikinci SELECT olarak bildirilmez. –

4

Bunu WHERE IN tip bildirimini kullanarak yapamazsınız. Bunun yerine, hedef tabloya (T2) LEFT JOIN ekleyebilir ve T2.ID'nin NULL olduğu yeri seçebilirsiniz..

SELECT 
    T1.* 
FROM 
    T1 LEFT OUTER JOIN T2 
    ON T1.A = T2.C AND T1.B = T2.D 
WHERE 
    T2.PrimaryKey IS NULL 

Örnek

için

sadece T2 karşılık gelen bir satır yok T1 satır döndürür.

+0

Anladığımdan emin değilim ama Tomalak bana bir cevap verdi! Ancak teşekkürler! –

1

Mysql'de "EXCLUDE" ifadesi olmadığı için onu Mysql'de kullandım.

Bu kod:

  1. Concates daha kolay sütunları karşılaştırmak yapmak için bir yeni alana masa T2 C ve D alanları.
  2. T1 tablosunun A ve B alanlarını sütunları karşılaştırmayı kolaylaştırmak için yeni bir alana dönüştürür.
  3. Yeni T1 alanının değerinin, yeni T2 alanının değerine eşit olmadığı tüm kayıtları seçer.

SQL Bildirimi:

SELECT T1.* FROM T1 
    WHERE CONCAT(T1.A,'Seperator', T1.B) NOT IN 
    (SELECT CONCAT(T2.C,'Seperator', T2.D) FROM T2) 
+0

Bu ifadenin neden soruya cevap verdiğini açıklar mısınız? –

+0

FH-Inway: Yorumu koddan önce yazıyorum. –

+0

Teşekkürler. İlk cümleninize bir bakabilir misiniz, bununla ne söylemek istediğinizden emin değilim. Soru, T-SQL'le ilgiliydi çünkü MySQL 'WHERE NOT IN''ünü desteklemiyor. –