SORU
8 Mart 2012, PERŞEMBE


SQL için önemli katılır?

Performans göz ardı ederek, sorgu A ve B aynı sonuç olacak mı aşağıda? Nasıl C ve D hakkında?

-- 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>  

CEVAP
8 Mart 2012, PERŞEMBE


INNER birleşimler için, Hayır, sıralaması önemli değil. Sorgular aynı sonuç, SELECT * seçer değiştirmek sürece 10 ** dönecektir.


(LEFT, RIGHT FULL) OUTER birleşimler için, Evet, sırası önemli - ve (güncellendi) işler çok daha karışık.

İlk olarak, dış birleşimler değişmeli olmayan, a LEFT JOIN b b LEFT JOIN a aynı şey değildir

Dış (commutativity ve birleşim) dahil olan özellikler: ya, senin örneklerde çok çağrışımlı değildir katılır

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

olur denk:

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

(Umarım) daha basit bir birleşim örnek. (a LEFT JOIN b) LEFT JOIN c: Bu 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

Bueşdeğerdir23**:

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

çünkü biz sadece "güzel" ON koşullar. ON b.ab_id = a.ab_id c.bc_id = b.bc_id hem eşitlik denetler ve NULL karşılaştırmalar içermez.

Hatta diğer operatörleri koşulları ya da daha karmaşık olanları vardır: ON a.x <= b.x ON a.x = 7 ON a.x LIKE b.x ON (a.x, a.y) = (b.x, b.y) ve iki sorgu hala eşdeğer olacaktır.

Ancak, herhangi birinin bu işin içinde IS NULL veya bir fonksiyon ile ilgili boşluk gibi COALESCE() örneğin, eğer durum b.ab_id IS NULL sonra iki sorgu olmaz eşdeğer.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • parlophone

    parlophone

    28 ŞUBAT 2006
  • sdasmarchives

    sdasmarchive

    2 HAZİRAN 2010
  • YouChewBu

    YouChewBu

    26 Ocak 2009