2010-03-03 27 views
5

başlık biraz kafa karıştırıcı olabilir, ben, açıklayayım;) 3 tablolar var :Varolmayan öğeler nasıl listelenir?

[names] 
n_id;name 
1;Jeff 
2;Adam 

[books] 
b_id;title 
1;Book1 
2;Book2 

[read] 
n_id;b_id 

tablo [ okundu] okunan kitaplar bulunan bir tablodur. Adam "Kitap1" öğesi içinde okur eğer [okumak] şuna benzer:

2;1 

şimdiye kadar, çok iyi. Şimdi, hangi kitapların bir kişi tarafından okunabileceğini bilmenin bir yolu var mı? Biz sadece Adem bir kitap "Kitap1" okuma olduğunu biliyoruz, bu yüzden sorgu gerektiği şöyle bir çıktı üretir:

n_id;name;b_id;title 
1;Jeff;1;Book1 
1;Jeff;2;Book2 
2;Adam;2;Book2 

o 1 sorguda Bunu yapmak için veya bazı komut dosyası gerekiyor mümkündür?

cevap

2

Sen names ve books tüm olası kombinasyonları almak için bir CROSS JOIN kullanabilir ve daha sonra orada mevcut satırları kaldırmak için IS NULL ile read bir LEFT JOIN kullanın. Herkes için

LEFT JOIN döner NULLr.n_id IS NULL aslında read satırları bulundu katılmak satırları kaldırır eğer öyleyse kontrol hiçbir satır mevcut sütun katıldı.

SELECT n.n_id, n.name, b.b_id, b.title 
FROM names n 
CROSS JOIN books b 
LEFT JOIN read r ON (r.n_id = n.n_id AND r.b_id = b.b_id) 
WHERE r.n_id IS NULL 
1

name ve book vs tüm çiftleri oluşturmak için çapraz birleştirmeye, ardından da read tablosuna katılın ve birleştirmenin başarısız olduğunu kontrol edin. Bir Kartezyen yapacağını

SELECT names.n_id, names.name, books.b_id, books.title 
FROM names 
CROSS JOIN books 
LEFT JOIN read 
ON names.n_id = read.n_id AND books.b_id = read.b_id 
WHERE read.n_id IS NULL 
1

sonra, tüm olası adı/kitap kombinasyonlarını elde etmek için isimler ve kitaplar arasında katılmak eksi okumuş olanlar:

SELECT n_id, b_id 
FROM names, books 
MINUS 
SELECT n_id, b_id 
FROM read 

Diğerleri çapraz katılmak yapıyor tavsiye ettiler ve Mükemmel bir şekilde çalışacak bir sol birleşim. Gerçek dünya senaryosunda hangisinin daha hızlı olduğunu görmek için her ikisini de denemek isteyebilir - soldan diğerlerinin daha hızlı olacağını düşündüğünden şüpheleniyorum ama emin değilim.

0

Sorunuz oldu "bir kişi tarafından okunan werent hangi kitapların bilmek için bir yol var mı?" Ancak, örnek sorgu sonuçlarınız, "Hangi kitapların tüm insanlar tarafından okunmadığını öğrenmenin bir yolu var mı?" Sorusunun cevabını gösterdi. Gerçekten belli bir kişi için sorgu çalıştırmak için sadece arıyorsanız

, böyle bir şey çalışması gerekir:

SELECT b_id, title 
FROM books --You said you're just looking for books 
WHERE b_id NOT IN 
    (SELECT b_id 
    FROM read 
    WHERE n_id = @names_id) --pass in the names_id as a parameter 
İlgili konular