2013-05-15 25 views
5

arasına bir filtre ekleme Bu nedenle, birleştirme işleminin WHERE deyimine filtre koşullarını eklemek için iyi bir programlama uygulaması olduğunu biliyorum, böylece katılımcılar tarafından döndürülen satır sayısını en aza indirgeyiz. FROM yerine WHERE'ye filtre eklememize karar verelim mi? Bunun yerine WHERE VE fıkrada b.ColD eklenen ne olur Bu sorgudaWHERE ile FROM

SELECT a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM TblA a INNER JOIN TblB b 
On a.ColA = b.ColD 
AND a.ColA = 'X' 
AND a.ColB = 'Y' 
WHERE b.ColD = 'ABC' 

: Örneğin? Bu sorguyu daha verimli yapmaz mı? Her iki yaklaşımda da sonuçların farklı olabileceğini biliyorum ama nedenini bilmiyorum.

Teşekkürler.

+0

için daha da parçalamak için çok CTEs kullanabilirsiniz. Yönetim stüdyosu, bir sorgunun yürütme planını gösterme yeteneğine sahiptir, böylece her iki sürümün farklılıklarını karşılaştırabilirsiniz. Benim _guess_, bununla birlikte çok fazla fark olmayacak. –

+3

THis bir kopya değil: OP filtreler hakkında soru soruyor, JOINs değil – gbn

+1

@gbn OP'nin ifadesi ("filtre" vs. "koşul" vb.) Çok yoğun olduğundan emin değilim, çünkü OP tarafından verilen örnek esasen [burada] ile aynıdır (http://stackoverflow.com/q/1907335/880904), [burada] (http://stackoverflow.com/q/1018952/880904), [burada] (http:/http://stackoverflow.com/q/15483808/880904) Bunların hepsi "JOIN ... ON" var, "WHERE" hakkında sorular soruyor ve sizinkilere benzer cevapları içeriyor. Bu sorunun yanıtlandığını ya da [bu soruyu] yeniden açmamız mı gerekiyor (http://stackoverflow.com/q/13145275/880904)? –

cevap

2

SQL gibi bir bildirim dilinde, olabildiğince açıklayıcı olması, yani JOIN mantığının ("veriyi nasıl bağlamak istiyorum?") WHERE mantığından ayrı tutulması yararlı olur ("filtrelemek istediğim" dışarı?"). Teknik olarak bu kesinlikle bir fark yaratamaz, ancak ikisini ayırmak için kendinizi zorluyorsanız, iyi bir akıl kontrol edin.

9

Bu benim deneyimimde nadiren fark yaratıyor. Olabilir, ama sık sık değil. Sorgu en iyisi bu şeyleri çalışır ve ikinci bir tahmin yapmanız gerekmez. kullanarak SOL olsa katıldığında bunun Genellikle sorgu semantiğini

değiştirdiği için

, o zaman I would separate JOIN and WHERE conditions for clarity and avoid ambiguities or partial/full cross joins, önemli olabilir. Bu cevap daha fazla bilgi için sadece

Not geçerli: Soru değil

"NEREDE JOIN fark" "NEREDE fark JOIN" ama ben sadece bu

SELECT 
    a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM 
    TblA a 
    INNER JOIN 
    TblB b On a.ColA = b.ColD 
WHERE 
    a.ColA = 'X' AND a.ColB = 'Y' AND b.ColD = 'ABC' 

yapacağını Ben yapmak istedim daha karmaşık ve eğer veya, optimizasyoncusu aptal (nadir) olmak ise
Bu aynı zamanda yardımcı olabilir daha iyi okuyun:

SELECT 
    a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM 
    (SELECT ColA, ColB, ColC FROM TblA 
    WHERE ColA = 'X' AND ColB = 'Y') a 
    INNER JOIN 
    (SELECT ColD, ColE FROM TblB WHERE ColD = 'ABC') b On a.ColA = b.ColD 
Bu son durumda

, bir, SQL Server kullanıyorsanız TSQL etiketi bakılırsa okunabilirlik

İlgili konular