web-gelistirme-sc.com

İki sütun kullanarak T-SQL "Nerede değil"

A ve B sütunlarındaki değerlerin, T2 tablosundaki C ve D sütunları için eşleşen Tuple olmadığı bir T1 tablosundaki tüm kayıtları seçmek istiyorum.

mysql içinde iki sütun kullanarak “içinde değil” Ben, T1'den A, B'yi seçerek (A, B) (SELECT C, D2'den T2 değil) seçmeyi başarabilir, ancak başarısız olur. benim için T-SQL "Hatalı sözdizimi ',' yakın.".

Peki bunu nasıl yaparım?

14
Anders Lindén

İlişkili bir alt sorgu kullanın:

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

SecondaryTable'da (c, d) üzerine bir bileşik dizin olduğundan emin olun, bu tablo çok fazla satır içermiyorsa.

26
Tomalak

Bunu bir WHERE IN type ifadesi kullanarak yapamazsınız.

Bunun yerine, hedef tabloya (T2) LEFT JOIN girebilir ve T2.ID'nin NULL nerede olduğunu seçebilirsiniz.

Örneğin

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

yalnızca T1'den T2'de karşılık gelen bir sıraya sahip olmayan satırları döndürür.

5
Kirk Broadhurst

Mysql'de kullandım çünkü Mysql'de "EXCLUDE" ifadesi yok.

Bu kod:

  1. Sütunların karşılaştırılmasını kolaylaştırmak için T2 tablosunun C ve D alanlarını yeni bir alana dönüştürür.
  2. Sütunların karşılaştırılmasını kolaylaştırmak için T1 tablosunun A ve B alanlarını 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 Beyanı:

SELECT T1.* FROM T1 
  WHERE CONCAT(T1.A,'Seperator', T1.B) NOT IN
    (SELECT CONCAT(T2.C,'Seperator', T2.D) FROM T2)
1
Malus Jan

İşte benim için işe yarayan cevabın bir örneği:

SELECT Count(1) 
    FROM LCSource as s
    JOIN FileTransaction as t
    ON s.TrackingNumber = t.TrackingNumber  
    WHERE NOT EXISTS (
        SELECT * FROM LCSourceFileTransaction 
        WHERE [LCSourceID] = s.[LCSourceID] AND [FileTransactionID] = t.[FileTransactionID]
    )

Her iki sütunun da LCSourceFileTransaction'da bulunduğunu görürsünüz, ancak biri LCSource'da ve biri FileTransaction'da ve LCSourceFileTransaction'da bir eşleme tablosudur. İki sütunun birleşiminin eşleme tablosunda olmadığı tüm kayıtları bulmak istiyorum. Bu harika çalışıyor. Umarım bu birine yardımcı olur.

0
Scott Shepherd