2010-10-04 16 views
9

Tipik bir Kişiler tablosuna ve JOIN sorgusunu tüm Kişiler için Siparişleri iade etmek için aşağıdaki şekilde yapabilecek şekilde tanımlanmış bir Siparişler tablosuna sahibim.Sipariş vermeksizin tüm müşterileri almak için SQL deyimi

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo 
FROM Persons 
INNER JOIN Orders 
ON Persons.id=Orders.Person_id 

Sorun şu ki, tüm Kişileri NO Emirleri ile iade edecek bir deyimi nasıl yazarım?

Ben mysql kullanıyorum.

Şimdiden teşekkürler.

cevap

17

Sen LEFT JOIN ve IS NULL kullanmak isteyebilirsiniz: katılmak şart herhangi bulamazsa bile

SELECT  Persons.LastName, Persons.FirstName 
FROM  Persons 
LEFT JOIN Orders ON Persons.id = Orders.Person_id 
WHERE  Orders.Person_id IS NULL; 

daima (Kişi) "sol" tablosunun tüm kayıtları içeren katılmak bir solun sonucu, "sağ" tablosundaki kayıtlar (Siparişler). Eşleşme olmadığında, "doğru" tablonun sütunları sonuç kümesinde NULL olacaktır.

8

Bu işe yarayacak ... birden fazla yol var. Sadece şeyiyle

select * from persons where person.id not in (select person_id from orders) 
+0

, o zaman o filtreler dış sorgu. Katılma cevabı gerçekten bunun için en iyi yoldur. –

3

, burada not exists sürümü: Bu gerçekten çalışır, ama ilk tüm siparişleri alır gibi büyük rekor setleri için çok verimsiz hale gelebilir

select * from persons p 
where not exists 
(select null from orders o where o.person_id = p.id) 
+0

Her üç cevap da sadece istediğim gibi çalışır. Herkese teşekkürler. – timeon