SQL birleştirme: where cümlesi vs. on cümlesi

Okuduktan sonra, bu Explicit vs Implicit SQL Joins'in bir kopyası değildir. Cevap ilişkili (hatta aynı) olabilir ancak soru farklıdır.


Aradaki fark nedir ve her birine ne girmelidir?

Teoriyi doğru anladıysam, sorgu iyileştirici her ikisini de birbirinin yerine kullanabilmelidir.

Çözüm

İkisi aynı şey değildir.

Bu sorguları düşünün:

SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
WHERE Orders.ID = 12345

ve

SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID 
    AND Orders.ID = 12345

İlki, 12345 numaralı sipariş için bir sipariş ve varsa satırlarını döndürecektir. İkincisi tüm siparişleri döndürür, ancak yalnızca 12345 siparişinin kendisiyle ilişkili herhangi bir satırı olacaktır.

Bir INNER JOIN ile tümceler etkili bir şekilde eşdeğerdir. Ancak, işlevsel olarak aynı olmaları, aynı sonuçları üretmeleri, iki tür cümlenin aynı semantik anlama sahip olduğu anlamına gelmez.

Yorumlar (10)

INNER JOIN`lerde bunlar birbirinin yerine kullanılabilir ve optimizer bunları istediği gibi yeniden düzenler.

OUTER JOIN'lerde, birleşimin hangi tarafına bağlı olduklarına bağlı olarak birbirlerinin yerine kullanılmaları gerekmez.

Okunabilirliğe bağlı olarak onları her iki yere de koyuyorum.

Yorumlar (2)

Bir iç birleşimde aynı anlama gelirler. Ancak, bir dış birleştirmede birleştirme koşulunu WHERE ile ON cümlesine koymanıza bağlı olarak farklı sonuçlar elde edersiniz. Bu ilgili soruya]1 ve bu cevaba (benim tarafımdan) bir göz atın.

Bence birleştirme koşulunu her zaman ON cümlesine koyma alışkanlığı edinmek en mantıklısıdır (bu bir dış birleştirme değilse ve aslında where cümlesinde olmasını istemiyorsanız), çünkü sorgunuzu okuyan herkes için tabloların hangi koşullara göre birleştirildiğini daha net hale getirir ve ayrıca WHERE cümlesinin düzinelerce satır uzunluğunda olmasını önlemeye yardımcı olur.

Yorumlar (0)