Başka bir tabloyla birleşmeyen satırlar nasıl hariç tutulur?


87

İki tablom var, birinin birincil anahtarı var, diğeri yabancı anahtar olarak var.

Yalnızca ikincil tablonun anahtarını içeren bir girişi yoksa birincil tablodan veri çekmek istiyorum . Yalnızca bu anahtarla bir araya gelen satırları döndüren basit bir iç birleşimin tersi.

Yanıtlar:


274

alternatif metin

SELECT <select_list> 
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

Birleşmenin tam resmi alternatif metin

Aticle'dan: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx


9
en sonunda! neden bunlar ders kitaplarında yok ve üniversitedeki hocalarım neden bunlara sahip değil ?! Dünyadaki olası en kötü açıklamaları kullandılar, bunlara uzaktan yakından değil!
pythonian29033

5
Bu altın. İçeriği olmayan ama coşkulu övgü olan bir yorum yazmaktan nefret ediyorum, ama hadi! Bu harika bir cevap. Teşekkürler @Pranay Rana.
0xbe5077

1
Lütfen benim için açıkla, neden B.Key IS NULLama yine de karşılaştırılabilir A.Key = B.Keymiyiz?
Do Nhu Vy

1
@DoNhuVy basit, karşılaştırma "ON" cümlesinde, eşleşen satır yoksa LEFT veya RIGHT birleşiminde, ardından tüm NULL'ları içeren bir satır birleştirilir ve ardından eşleşen satır olmadığını bilmek için IS NULL için test edin . (Bu arada, bu arada, test ettiğiniz alan BOŞ DEĞİLSE, yani başka bir nedenle NULL
olamazsa işe yarar

Aşağıdaki sorguyu kullanıyorum: SELECT A. * #PurgeFilesListNew'den A TAM DIŞ BİR KATILIN #DoNotPurgeFilesListNew B. A. AccountID NULL VEYA B.AccountID NULL Temel olarak, "ON" yan tümcesinde iki değeri karşılaştıran iki tane yaşıyorum. İyi çalışıyor, ancak sorgu eşleşmeyen satırlar için boş satır döndürüyor. Bunu nasıl çözebilirim? Lütfen yardım et
HarshSharma

10
SELECT
   *
FROM
   primarytable P
WHERE
   NOT EXISTS (SELECT * FROM secondarytable S
     WHERE
         P.PKCol = S.FKCol)

Genellikle , (NOT) EXISTSbir daha iyi bir seçimdir sonra (NOT) INya(LEFT) JOIN


iyi, DBRMS'nin kullanıldığını yayınlamadı, ancak MySql'de LEFT JOINdaha iyi performans gösteriyorNOT EXIST
The Scrum Meister

@ The Scrum Meister: Daha hızlı mı dedim? Anlamsal ve mantıksal farklılıkları keşfetmek için IN - EXISTS - JOIN
araması yapın

@gbn Üzgünüm, "daha iyi seçim" derken daha hızlı demek istediğini düşündüm. O halde lütfen bunun ne şekilde daha iyi bir seçim olduğunu açıklar mısınız? açıklamakinextended.com/2009/
The Scrum Meister

1
@ The Scrum Meister: Genel olarak, her türden JOIN bir DISTINCT'e ihtiyaç duyabilir. Listede bir null ile NOT IN yanlış verir. IN / EXISTS aynı şekilde davranır. Ancak, tutarsızlığı
sevmediğiniz

@ The Scrum Meister: açıklamakinextended.com /
2009/

4

"mevcut olmayan" bir sol birleşim kullanın:

SELECT p.*
FROM primary_table p LEFT JOIN second s ON p.ID = s.ID
WHERE s.ID IS NULL

4

Başka bir çözüm şudur:

SELECT * FROM TABLE1 WHERE id NOT IN (SELECT id FROM TABLE2)

3
SELECT P.*
FROM primary_table P
LEFT JOIN secondary_table S on P.id = S.p_id
WHERE S.p_id IS NULL

2
Bir sorum var ... koşulu kullanıyorsak P.key = S.keyve sonra diyorsak where S.key IS NULL, bu P.key'i de boş yapmaz mı?
Somjit

2

İkinci tabloda da bulunan "Birinci Tablo" dan sütunları seçmek isterseniz, bu durumda da kullanabilirsiniz.Bu EXCEPTdurumda sütun isimleri de farklı olabilir ancak veri tipi aynı olmalıdır.

Misal:

select ID, FName
from FirstTable
EXCEPT
select ID, SName
from SecondTable

0

Bunun COGNOS'ta kullanılması faydalı oldu çünkü Cognos'ta SQL "İçinde değil" ifadesi oluşturmaya izin veriliyordu, ancak çalıştırılması çok uzun sürdü. Cognos'taki B tablosuna A. anahtarı "değil" B. anahtarı olarak katılmak için A tablosunu manuel olarak kodladım, ancak sorgu çok uzun sürüyordu / 5 dakika sonra sonuç döndürmüyordu.

Cognos'ta bir "YERDE DEĞİL" çözümü arayanlar için, işte yaptığım şey buydu. Bağlantı türünü seçerek Cognos'ta tablo A ve B'yi bir LEFT JOIN ile birleştiren bir Sorgu oluşturun: tablo A.Anahtar, B tablosunda "0 ila N" değerlerine sahiptir, sonra aşağıdakiler için bir Filtre (Bunlar Yer Maddelerine karşılık gelir): tablo B .Anahtar NULL.

Hızlı koştu ve büyü gibi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.