2016-04-04 17 views
0

Bu neredeyse bir sol birleşim durumudur, ancak sql'de nasıl ifade edeceğimi göremiyorum. User, Item, Flag alanlarına sahip bir tabloyu Orders düşünün. Tabloda görünen Kullanıcıların bir listesine ihtiyacımız var, ancak Bayrak = True değerinde satırları olmayan. (Bu alanların hiçbiri boş değil.) Eşdeğerde, Kullanıcı için tüm satırlarda Bayrak = False ve bu satırlar var.sql eşleşmemiş anahtarlar ölçütler

Ben safça yazarsınız: SELECT T1.User FROM Orders AS T1 LEFT JOIN Orders AS T2 ON T1.User=T2.User WHERE T2.Flag=TRUE AND T2.User IS NULL sağda satırları seçin ve sonra kontrol etmek için hiç eşleşme elde katılmak, ama sağ

üzerinde satırlara hem kriterleri uygulandığı gibi, çalışmıyor tabii

Denedim: SELECT T1.User FROM Orders AS T1 WHERE T1.User NOT IN (SELECT DISTINCT User FROM Orders WHERE Flag=TRUE) ancak Microsoft Access'te, bu, ikinci seçimin ilkinin her satırı için çalıştırılıyormuş gibi derece yavaştır. Şimdiye kadar, tek çözüm, ikinci seçenekten geçici bir tablo oluşturmak olmuştur. Ama bu basit bir problem, sql'de ifade etmenin iyi bir yolu olmalı. (Eğer bu aşikarsa özür dilerim; hala sql'in karmaşık semantiklerinden geçiyorum.)

+0

İlk sorguda 'T1.User = NULL' deneyin. Ve neden ikinci sorguda farklı kullanılır? SQL dünyasında sıkça tartışılan [LEFT JOIN NULL, NOT IN, EXISTS] (http://www.google.com/search?q=left+join+vs+not+in) eşleşmeyenler için değiştirilebilir kayıt sorguları. – Parfait

cevap

0

Alt sorgu çözümünüz gayet iyi ve endeksleme sorunlarınız olmadıkça neden yavaş olduğunu hayal edemiyorum. Sorunuzla ilgili olarak, tamamen anladığımdan emin değilim, ancak filtre koşullarınızın her iki tabloya da uygulandığı sorunlar varsa, koşulu WHERE yan tümcesi yerine birleştirme koşuluna eklemeyi deneyin.

SELECT T1.User 
FROM Orders AS T1 

LEFT JOIN Orders AS T2 
ON T1.User=T2.User 
AND T2.Flag = 'TRUE' 

WHERE T2.Flag=TRUE 
AND T2.User IS NULL 
İlgili konular