2012-03-08 30 views
125

Performans göz ardı edilirse, A ve B sorgusundan aynı sonucu alır mıyım? C ve D'ye ne dersin? INNER içinSQL'de birleştirme sırası önemlidir mi?

-- A 
select * 
from a left join b 
      on <blahblah> 
     left join c 
      on <blahblan> 


-- B 
select * 
from a left join c 
      on <blahblah> 
     left join b 
      on <blahblan> 

-- C 
select * 
from a join b 
      on <blahblah> 
     join c 
      on <blahblan> 


-- D 
select * 
from a join c 
      on <blahblah> 
     join b 
      on <blahblan> 
+5

'nedir? A'dan B'ye ve A'dan C'ye mi katılıyorsunuz yoksa A'dan B'ye ve B'den B'ye mi katılıyorsunuz? – beny23

+1

Merhaba Beny, sorumun içindeki kod bir soyutlamadır. A'dan B'ye veya A'dan C'ye katılma konusunda endişe duymuyorum, sadece aynı sonuçları veren sözdizimini bilmesini istiyorum. –

cevap

156

hayır, sırası önemli değildir, katılır. Sorgularınız, SELECT * seçimlerinizi SELECT a.*, b.*, c.* olarak değiştirdiğiniz sürece aynı sonuçları döndürecektir. ve (güncellenmiş) işler çok daha karmaşıktır - (LEFT, RIGHT veya FULL) OUTER için


evet, sipariş konularda, katılır.

a LEFT JOIN b 
    ON b.ab_id = a.ab_id 
    LEFT JOIN c 
    ON c.ac_id = a.ac_id 
:

İlk

dış katılır böylece a LEFT JOIN b (değişmeli ve birleşme) şeklinde daki örneklerde özellikleri, bu yüzden birleştirici değildir ya b LEFT JOIN a

Outer katılır aynı değildir, değişmeli değildir

eşdeğerdir:

a LEFT JOIN c 
    ON c.ac_id = a.ac_id 
    LEFT JOIN b 
    ON b.ab_id = a.ab_id 

ama:

a LEFT JOIN b 
    ON b.ab_id = a.ab_id 
    LEFT JOIN c 
    ON c.ac_id = a.ac_id 
    AND c.bc_id = b.bc_id 

eşdeğer değildir:

a LEFT JOIN c 
    ON c.ac_id = a.ac_id 
    LEFT JOIN b 
    ON b.ab_id = a.ab_id 
    AND b.bc_id = c.bc_id 

başka (umutla basit) birleşme, örneğin. (a LEFT JOIN b) LEFT JOIN c olarak düşünün:

a LEFT JOIN b 
    ON b.ab_id = a.ab_id   -- AB condition 
LEFT JOIN c 
    ON c.bc_id = b.bc_id   -- BC condition 

Bu a LEFT JOIN (b LEFT JOIN c) eşdeğerdir:

a LEFT JOIN 
    b LEFT JOIN c 
     ON c.bc_id = b.bc_id   -- BC condition 
    ON b.ab_id = a.ab_id   -- AB condition 

biz "güzel" ON koşullara sahip diye. Hem ON b.ab_id = a.ab_id hem de c.bc_id = b.bc_id eşitlik denetimleridir ve NULL karşılaştırmaları içermez.

Hatta diğer operatörler ya da benzeri daha karmaşık olanlarla koşullara sahip olabilir: ON a.x <= b.x veya ON a.x = 7 veya ON a.x LIKE b.x veya ON (a.x, a.y) = (b.x, b.y) ve iki sorgular hala eşdeğer olacaktır.

Ancak eğer durum daha sonra iki sorgular eşdeğer olmaz, b.ab_id IS NULL olsaydı, örneğin COALESCE() gibi null ile ilgilidir bu alan IS NULL veya bir fonksiyonun herhangi. Düzenli Bağlantılar için

+2

Dış birleştirmenin ilişkilendirilmesi, yüklemelerin, bir tablonun tüm sütunlarının NULL olduğu bir satır tarafından karşılanamayacağı sürece ilişkilendiricidir, aksi takdirde yüklemelerin IS NULL içermediği sürece ilişkilendirilebilir veya 'sıfırlarla ilgili bir işlev'. Biri, önceki tanımı tatmin eden bir yüklemi kolayca hayal edebilir, ancak “a.somecol> 0 VEYA b.someothercol> 0”; Bu durum için ilişkililik başarısız olabilir. –

+0

Ancak, bence, burada belirtilen koşullardan herhangi birini tatmin etmediği sürece DIŞ JOIN'in ilişkilendirici olduğunu söylemek teknik olarak doğrudur: http://stackoverflow.com/questions/20022196/are-left- dış-birleştirmeler-birleştirici/20022925 # 20022925 (birincisi aynı zamanda INNER JOIN'ler için birleşikliği bozar, ama belki de bahsetmeye değmeyecek kadar kırılgan bir yaklaşımdır.) Aynı zamanda Ortak bir tür JOIN - Yabancı bir anahtara katılma - bu koşullardan hiçbirini tatmin etmez ve bu nedenle hoş ve ilişkilendiricidir. –

+0

@MarkAmery Teşekkür ederim, bu noktada cümleleri yapılandırarak zor bir zaman geçiriyordum (ve sizin bu cevabınızı zaten bastım;) –

4

, bunu yapmaz. TableA join TableBTableB join TableA aynı yürütme planı (böylece C ve D örnekleri aynı olacaktır) sol için

üretmek ve sağ öyle katılır olacaktır.TableA left Join TableB,'dan farklı, ANCAK aynıdır, ancak TableB right Join TableA

+2

Bu yalnızca değişmezliğe işaret eder, ancak sorudaki örnekler, asistanın ilişkiselliğe ilgi gösterdiğini göstermektedir. Ypercube'un cevabı her ikisini de ele alıyor. –

İlgili konular