INNER JOIN ON vs WHERE yan tümcesi


941

Basitlik açısından, ilgili tüm alanların olduğunu varsayalım NOT NULL.

Yapabilirsin:

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1, table2
WHERE
    table1.foreignkey = table2.primarykey
    AND (some other conditions)

Veya:

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1 INNER JOIN table2
    ON table1.foreignkey = table2.primarykey
WHERE
    (some other conditions)

Bu ikisi aynı şekilde çalışıyor MySQLmu?




18
Doğru anladım, ilk varyant ANSI SQL-89 örtük sözdizimi ve ikinci varyant ANSI SQL-92 açık birleşim sözdizimidir. Her ikisi de SQL uygulamalarına uymada aynı sonuca ve her ikisi de iyi yapılmış SQL uygulamalarında aynı sorgu planına neden olacaktır. Ben şahsen SQL-89 sözdizimini tercih ediyorum ama birçok insan SQL-92 sözdizimini tercih ediyor.
Mikko Rantalainen

11
@Hogan, farklı sözdizimleri için resmi isimlere işaret ediyordum. Cevapların hiçbiri tam adlarını açıkça belirtmedi, bu yüzden bunları yorum olarak eklemeye karar verdim. Ancak, yorumum asıl soruya cevap vermedi, bu yüzden bunu yorum olarak, cevap olarak ekledim. (Yüksek oyu verilen cevapların "INNER JOIN ANSI sözdizimi" ve "örtük birleştirme ANSI sözdizimi daha eski" gibi iddiaları vardır, çünkü her iki sözdizimi farklı ANSI sözdizimi olduğundan hiçbir şey söylemez.)
Mikko Rantalainen

Yanıtlar:


710

INNER JOIN kullanmanız gereken ANSI sözdizimidir.

Özellikle çok sayıda masaya katıldığınızda genellikle daha okunabilir kabul edilir.

Ayrıca OUTER JOINihtiyaç duyulduğunda kolayca değiştirilebilir .

WHERESözdizimi daha ilişkisel model aydınlatmaktadır.

İki tablonun sonucu, JOINyalnızca birleştirme sütunlarının eşleştiği satırları seçen bir filtrenin uygulandığı tabloların kartezyen bir ürünüdür.

WHERESözdizimi ile bunu görmek daha kolay .

Örneğin, MySQL'de (ve genellikle SQL'de) bu iki sorgu eşanlamlıdır.

Ayrıca MySQL'in de bir STRAIGHT_JOINmaddesi olduğunu unutmayın .

Bu yan tümceyi kullanarak, JOINsırayı kontrol edebilirsiniz : hangi tablo dış döngüde taranır ve hangisi iç döngüdedir.

WHERESözdizimini kullanarak MySQL'de bunu kontrol edemezsiniz .


10
Teşekkürler, Quassnoi. Anslarınızda çok fazla ayrıntı var; "evet, bu sorguların eşdeğer olduğunu, ancak daha kolay okunabilir ve değiştirilmesi daha kolay olduğu için iç birleşimi kullanmanız gerektiğini" söylemek doğru mudur?
allyourcode

8
@allyourcode: için Oracle, SQL Server, MySQLve PostgreSQL- evet. Diğer sistemler için de, muhtemelen kontrol etsen iyi olur.
Quassnoi

13
FWIW, WHEREyan tümcedeki birleştirme koşullarında virgül kullanarak ANSI standardındadır.
Bill Karwin

1
@Bill Karwin: JOINanahtar kelime geçmişte göründüğü kadar yakın olana kadar özel standartların bir parçası değildi. Sadece Oraclesürümde 9ve PostgreSQLsürümde 7.2(her ikisi de piyasaya sürüldü) girdi 2001. Bu anahtar kelimenin görünümü, ANSIstandart benimsemenin bir parçasıydı ve bu nedenle, bu anahtar kelimenin, ANSIeş anlamlı CROSS JOINolarak eş anlamlı olarak da desteklemesine rağmen, bu anahtar kelime genellikle ilişkilendirilir .
Quassnoi

9
Bununla birlikte, ANSI SQL-89, bir cümledeki virgül ve koşullarla yapılacak birleştirmeleri WHEREbelirtmiştir (koşullar olmadan, birleştirme, dediğin gibi çapraz birleştirmeye eşdeğerdir). ANSI SQL-92 JOINanahtar kelimeyi ve ilgili sözdizimini ekledi , ancak geriye dönük uyumluluk için virgül tarzı sözdizimi hala destekleniyor.
Bill Karwin

182

Diğerleri, INNER JOINinsanın okunabilirliğine yardımcı olduğuna dikkat çekti ve bu en öncelikli konu.
Birleştirme sözdiziminin neden daha okunabilir olduğunu açıklamaya çalışayım .

Temel bir SELECTsorgu şudur:

SELECT stuff
FROM tables
WHERE conditions

SELECTFıkra anlatır neyi geri alıyoruz; FROMfıkra söyler nereye biz besleniyoruz ve WHEREfıkra bize anlatır ki biz alıyoruz olanlar.

JOIN tablolar, nasıl birbirine bağlandıkları (kavramsal olarak, aslında tek bir tabloya) hakkında bir ifadedir.

Tabloları kontrol eden herhangi bir sorgu öğesi - bir şeyler aldığımız yer - anlamsal olarak cümleye aittir FROM(ve elbette, JOINöğeler buraya gider). Birleştirme öğelerini WHEREmaddeye koymak , hangisinin ve nereden geldiğini birleştirir , bu yüzden JOINsözdizimi tercih edilir.


7
İç birleşimin neden tercih edildiğini açıkladığın için teşekkürler Carl. Sanırım ans diğerlerinde örtüktü, ancak açık genellikle daha iyidir (evet, ben bir Python hayranıyım).
allyourcode

2
ON ve WHERE semantikleri, son OUTER JOIN'dan sonra JOIN'ler için hangisini kullandığınızın önemli olmadığı anlamına gelir . ON'u JOIN'in bir parçası olarak nitelemenize rağmen, aynı zamanda Kartezyen bir üründen sonra bir filtreleme. Hem ON hem de WHERE kartezyen bir ürünü filtreler. Ancak , son DIŞ ORTAK birleşmeden önce AÇIK veya WHERE ile bir alt seçim kullanılmalıdır . (JOINs "on" sütun çifti değildir. Herhangi bir koşulda iki tablo birleştirilebilir. Bu,
JOIN'leri

INNER JOIN ile aynı etkiyi WHERE kullandığınızda bile, sorgunun FROM bölümünde iki tablonuzdan bahsedeceksiniz. Yani temelde hala verilerinizi FROM yan tümcesinde nereden aldığınız anlamına geliyorsunuz, bu yüzden mutlaka "hangisini ve nereden geldiğini" birleştirdiğini söyleyemezsiniz
cybergeek654

@ArsenKhachaturyan Bir anahtar kelimenin veya tanımlayıcının metinde kullanılması, kod olduğu ve kod formatına ihtiyacı olduğu anlamına gelmez. Bu, herhangi bir şekilde gidebilecek bir biçimlendirme seçimidir ve burada düzenlemenin makul olması durumunda, her gönderinin sürekli olarak diğer biçime göre düzenlenmesi haklı olabilir - yani, haklı değildir. (Artı satır başına kelime kodu biçimini okumak zor olabilir.) Buradaki paragraf kesmeleri için de aynıdır - özellikle açıklığa kavuşturulmamıştır. 'Hangi' vs 'ile' aynı. Ve programlama dili adları gerekir değil kod biçiminde olması. PS Hatalı bir satır sonu eklediniz.
philipxy

@philipxy, "bunun anlamı ..." anlamına gelmediğini, ancak açıkçası bu kod anahtar kelimesiyle işaretlenemeyeceği anlamına gelmedi. Evet yapılacak bir seçim ama bu gerçeği bilmeden birçok gönderi yapıldı. Bu nedenle, değişiklik yapma kararım hiçbir şeyi kırmak değil, daha okunabilir hale getirmek için tasarlandı. Değişiklikleri oluşturduktan sonra herhangi bir mola fark ettiyseniz, bunun için üzgünüm ve açıkçası bu değişiklikleri geri alabilirsiniz.
Arsen Khachaturyan

143

Koşullu ifadeleri ON / WHERE içinde uygulama

Burada mantıksal sorgu işleme adımları hakkında açıkladım.


Başvuru: İçinde Microsoft® SQL Server ™ 2005 T-SQL Sorgulama
Yayımcısı: Microsoft Press
Pub Tarih: 07 Mart 2006
Yazdır ISBN-10: 0-7356-2313-9
Yazdır ISBN-13: 978-0-7356-2313-2
Sayfalar: 640

Microsoft® SQL Server ™ 2005 T-SQL Sorgusu İçinde

(8)  SELECT (9) DISTINCT (11) TOP <top_specification> <select_list>
(1)  FROM <left_table>
(3)       <join_type> JOIN <right_table>
(2)       ON <join_condition>
(4)  WHERE <where_condition>
(5)  GROUP BY <group_by_list>
(6)  WITH {CUBE | ROLLUP}
(7)  HAVING <having_condition>
(10) ORDER BY <order_by_list>

SQL'in diğer programlama dillerinden farklı olan ilk dikkat çeken yönü, kodun işlenme sırasıdır. Çoğu programlama dilinde, kod yazıldığı sırada işlenir. SQL'de, işlenen ilk yan tümce FROM yan tümcesi iken, ilk görünen SELECT yan tümcesi neredeyse son işlenir.

Her adım, aşağıdaki adıma girdi olarak kullanılan sanal bir tablo oluşturur. Bu sanal tablolar arayan tarafından kullanılamaz (istemci uygulaması veya dış sorgu). Yalnızca son adım tarafından oluşturulan tablo arayana döndürülür. Bir sorguda belirli bir cümle belirtilmezse, karşılık gelen adım atlanır.

Mantıksal Sorgu İşleme Aşamalarının Kısa Açıklaması

Adımların açıklaması şimdilik çok anlamlı görünmüyorsa çok fazla endişelenmeyin. Bunlar referans olarak verilmiştir. Senaryo örneğinden sonra gelen bölümler adımları daha ayrıntılı olarak ele alacaktır.

  1. FROM: FROM yan tümcesindeki ilk iki tablo arasında bir Kartezyen ürün (çapraz birleştirme) gerçekleştirilir ve sonuç olarak sanal tablo VT1 oluşturulur.

  2. ON: ON filtresi VT1'e uygulanır. <join_condition>VT2'ye yalnızca TRUE olan satırlar eklenir.

  3. OUTER (birleştirme): Bir OUTER JOIN belirtilirse (bir CROSS JOIN veya INNER JOIN yerine), korunmuş tablodan veya eşleşme bulunmayan tablolardan gelen satırlar, dış satırlar olarak VT2'den satırlara eklenir. VT3. FROM yan tümcesinde ikiden fazla tablo görünürse, tüm birleştirmeler işleninceye kadar 1 ile 3 arasındaki adımlar son birleştirmenin sonucu ile FROM yan tümcesinde bir sonraki tablo arasına art arda uygulanır.

  4. NEREDE: WHERE filtresi VT3'e uygulanır. <where_condition>VT4'e yalnızca TRUE olan satırlar eklenir.

  5. GROUP BY: VT4'teki satırlar, GROUP BY deyiminde belirtilen sütun listesine göre gruplar halinde düzenlenir. VT5 üretilir.

  6. KÜP | ROLLUP: Üst gruplara (grup grupları) VT5'ten VT6 üreten satırlar eklenir.

  7. HAVING: HAVING filtresi VT6'ya uygulanır. <having_condition>VT7'ye yalnızca DOĞRU olan gruplar eklenir.

  8. SELECT: SELECT listesi işlenir ve VT8 üretilir.

  9. DISTINCT: Yinelenen satırlar VT8'den kaldırılır. VT9 üretilir.

  10. ORDER BY: VT9'daki satırlar ORDER BY yan tümcesinde belirtilen sütun listesine göre sıralanır. Bir imleç üretilir (VC10).

  11. TOP: Belirtilen satır sayısı veya yüzdesi VC10'un başından itibaren seçilir. Tablo VT11 üretilir ve arayana geri gönderilir.



Bu nedenle, (INNER JOIN) ON, WHERE yantümcesini uygulamadan önce verileri filtreleyecektir (VT'nin veri sayısı burada azaltılacaktır). Sonraki birleştirme koşulları, performansı artıran filtrelenmiş verilerle yürütülür. Bundan sonra sadece WHERE koşulu filtre koşullarını uygulayacaktır.

(ON / WHERE içinde koşullu ifadeler uygulamak, birkaç durumda çok fazla fark yaratmayacaktır. Bu, kaç tabloya katıldığınıza ve her birleştirme tablosunda mevcut satır sayısına bağlıdır)


10
"Bu nedenle, (INNER JOIN) ON, WHERE deyimini uygulamadan önce verileri filtreleyecektir (VT'nin veri sayısı burada azaltılacaktır)." Şart değil. Makale, işlemenin mantıksal sırası ile ilgilidir. Belirli bir uygulamanın başka bir şeyden önce bir şey yapacağını söylediğinizde, uygulanan işleme sırasından bahsedersiniz . Sonuç, uygulamanın mantıksal sırayı izlemesi ile aynı olduğu sürece, uygulamaların istedikleri optimizasyonları yapmasına izin verilir. Joe Celko bu konuda Usenet'e çok şey yazdı.
Mike Sherrill 'Cat Recall'

@rafidheen "(INNER JOIN) ON verileri filtreleyecek ... WHERE yantümcesini uygulamadan önce ... bu da performansı artırır." İyi bir nokta. "Bundan sonra sadece NEREDE koşulu filtre koşullarını uygular" HAVING cümlesi ne olacak?
James

@James rafidheen'in iddiaları yanlış. Kılavuzdaki 'optimizasyona katıl' konusuna bakın. Ayrıca bu sayfadaki diğer yorumlarım. (Ve MikeSherrill'CatRecall'ların.) Böyle "mantıksal" açıklamalar, gerçekte nasıl hesaplandığını değil, sonuç değerini tanımlar. Ve böyle bir uygulama davranışının değişmeyeceği garanti edilmez.
philipxy

67

Örtülü birleştirme ANSI sözdizimi daha eskidir, daha az açıktır ve önerilmez.

Ek olarak, ilişkisel cebir, WHEREmaddede öngörülerin birbirinin yerine geçebilmesine olanak tanır ve bu INNER JOINnedenle maddelerle yapılan INNER JOINsorgular bile WHEREtahminlerin optimize edici tarafından yeniden düzenlenmesini sağlayabilir.

Sorguları mümkün olan en okunabilir şekilde yazmanızı öneririm.

Bazen bu, INNER JOINgöreceli olarak "eksik" WHEREhale getirmeyi ve filtreleme ölçütlerinin listelerinin daha kolay korunabilmesini sağlamak için bazı ölçütleri basitçe koymayı içerir .

Örneğin:

SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
    ON ca.CustomerID = c.CustomerID
    AND c.State = 'NY'
INNER JOIN Accounts a
    ON ca.AccountID = a.AccountID
    AND a.Status = 1

Yazmak:

SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
    ON ca.CustomerID = c.CustomerID
INNER JOIN Accounts a
    ON ca.AccountID = a.AccountID
WHERE c.State = 'NY'
    AND a.Status = 1

Ama elbette buna bağlı.


16
İlk pasajınız kesinlikle beynimi daha fazla incitiyor. Bunu gerçekten yapan var mı? Bunu yapan biriyle tanışırsam, onu kafamdan dövmem iyi olur mu?
allyourcode

3
Ölçütleri en anlamlı olan yere yerleştiriyorum. Geçici olarak tutarlı bir anlık görüntü arama tablosuna katılıyorsam (ve geçerli bir tarih seçimini zorunlu kılan bir görünümüm veya UDF'm yoksa), etkin tarihi WHERE'a eklemeyeceğim ve WHERE içine eklemeyeceğim yanlışlıkla çıkarılması muhtemeldir.
Cade Roux

14
@allyourcode: INNER JOIN'lerde bu tür birleştirme sözdizimini görmek nadir olsa da, RIGHT JOIN'ler ve LEFT JOINS için oldukça yaygındır - birleştirme yükleminde daha fazla ayrıntı belirtmek bir alt sorgu ihtiyacını ortadan kaldırır ve dış birleşimlerinizin yanlışlıkla çevrilmesini önler INNER JOINs. (INNER JOINs için neredeyse her zaman WHERE yan tümcesine c.State = 'NY' koyacağımı kabul etsem de)
Dave Markle

1
@allyourcode Bunu kesinlikle yaparım! Ve Cade ile hemfikirim .. Yapmamak için iyi bir neden
Arth

31

Örtülü birleşimler (ilk sorgunuz olarak bilinir), sorgunuza daha fazla tablo eklemeye başlamanız gerektiğinde çok daha karmaşık, okunması zor ve bakımı zor hale gelir. Dört veya beş farklı masada aynı sorguyu ve birleştirme türünü yaptığınızı düşünün ... bu bir kabus.

Açık bir birleştirme (ikinci örneğiniz) kullanmak çok daha okunabilir ve bakımı kolaydır.


48
Daha fazla anlaşamadım. JOIN sözdizimi son derece gariptir ve organize edilmesi zordur. WHERE yan tümce birleşimlerini kullanarak 5, 10, hatta 15 tablo katılmadan sorguları bol var ve onlar mükemmel okunabilir. Böyle bir sorguyu JOIN sözdizimi kullanarak yeniden yazmak karmaşık bir karışıklığa neden olur. Bu sadece bu sorunun doğru cevabı olmadığını ve neyin daha rahat olduğuna bağlı olduğunu gösteriyor.
Noah Yetter

33
Noah, sanırım burada azınlıkta olabilirsiniz.
matt b

2
Matt ve Noah'a +1 gelirim. Çeşitliliği seviyorum :). Nuh'un nereden geldiğini görebiliyorum; iç birleşim, dile yeni bir şey katmaz ve kesinlikle daha ayrıntılıdır. Öte yandan, 'nerede' durumunuzu çok daha kısaltabilir, bu da genellikle okunmasının daha kolay olduğu anlamına gelir.
allyourcode

5
Herhangi bir aklı başında DBMS'nin iki sorguyu aynı yürütme planına çevireceğini varsayarım; ancak gerçekte her DBMS farklıdır ve kesin olarak bilmenin tek yolu yürütme planını gerçekten incelemektir (yani, kendiniz test etmeniz gerekir).
matt b

@Rafidheen'in başka bir cevapta (SQL yürütme işleminin ayrıntılı sırasına sahip olan) önerdiği gibi, JOIN'lerin birer birer filtrelenmesi, 3 veya daha fazla tablonun tam kartezyen birleşimine kıyasla birleştirme işlemlerinin boyutunu azaltması doğru mu? filtre geriye dönük olarak uygulanıyor mu? Eğer öyleyse, JOIN'in performans iyileştirmesi (ayrıca başka bir cevaba da işaret ettiği gibi sol / sağ birleşimlerde avantajlar) sunmasını önerecektir.
James

26

Ayrıca eski sözdizimini kullanmanın hataya daha açık olduğunu da göstereceğim. ON yan tümcesi olmadan iç birleşimler kullanırsanız, bir sözdizimi hatası alırsınız. Eski sözdizimini kullanır ve where yan tümcesindeki birleştirme koşullarından birini unutursanız, çapraz bir birleşim elde edersiniz. Geliştiriciler genellikle sorunu çözdüğü anlaşılan, ancak sorguyu önemli ölçüde yavaşlatacak farklı bir anahtar kelime ekleyerek (birleştirmeyi düzeltmek yerine, yine de birleştirmenin kendisinin kırık olduğunu fark etmiyorlar) ekler.

Ayrıca, eski sözdiziminde çapraz bir birleşim varsa bakım için, bakıcı bir tanesine sahip olup olmadığınızı (çapraz birleşmelerin gerekli olduğu durumlar vardır) veya düzeltilmesi gereken bir kaza olup olmadığını nasıl bilecek?

Sol birleşimleri kullanırsanız örtük sözdiziminin neden kötü olduğunu görmek için sizi bu soruya yönlendireyim. Sybase * = aynı iç masa için 2 farklı dış tabla ile Ansi Standardına

Artı (kişisel rant), açık birleşimleri kullanan standart 20 yaşın üzerindedir, yani örtük birleştirme sözdizimi bu 20 yıldır modası geçmiş demektir. 20 yıldır modası geçmiş sözdizimi kullanarak uygulama kodu yazar mısınız? Neden veritabanı kodu yazmak istiyorsunuz?


3
@HLGEM: Açık JOIN'lerin daha iyi olduğunu tamamen kabul etsem de, sadece eski sözdizimini kullanmanız gereken durumlar var. Gerçek bir dünya örneği: ANSI JOIN, 2001 yılında piyasaya sürülen 9i sürümünde Oracle'a girdi ve sadece bir yıl öncesine kadar (standardın yayınlandığı andan 16 yıl sonra), sahip olduğumuz 8i kurulumunu desteklemem gerekti kritik güncellemeleri yayınlamak için. İki güncelleştirme setini korumak istemedim, bu yüzden 8i dahil tüm veritabanlarına yönelik güncellemeleri geliştirdik ve test ettik, bu da ANSI JOIN'leri kullanamadığımız anlamına geliyordu.
Quassnoi

INNER JOIN içermeyen sintaksın daha fazla hataya eğilimli olduğunu belirttiğinizde +1 ilginç nokta "... açık birleştirmeleri kullanan standart 17 yaşında" dediğinde son cümlenle ilgili kafam karıştı. o zaman INNER JOIN anahtar sözcüğünü kullanmanızı önerir misiniz?
Marco Demaio

1
@Marco Demaio, evet her zaman INNER JOIN veya JOIN (bu ikisi aynıdır) veya LEFT JOIN veya RIGHT JOIN veya CROSS JOIN kullanın ve asla örtük virgül birleşimlerini kullanmayın.
HLGEM

2
"Neden [20 yaşında] bir veritabanı kodu yazmak istiyorsun?" - SQL türetilmiş tabloları desteklemeye başladığından beri 'modası geçmiş' kullanarak SQL yazdığınızı fark ediyorumHAVING . Ayrıca 'modası geçmiş' NATURAL JOINolduğunu iddia etsem de kullanmadığınızı fark ettim INNER JOIN. Evet, nedenleriniz var (onları burada tekrar belirtmeye gerek yok!): Demek istediğim, eski sözdizimini kullanmaktan hoşlananların da nedenleri var ve sözdiziminin göreceli yaşı, herhangi bir ilgisi varsa azdır.
gün14

1
NEREDE hala standartta (nerede olmadığını göster). Yani, görünüşte modası geçmiş bir şey yok. Ayrıca, gösteriler bana genel olarak DBMSs uzak tutulmalıdır bir geliştirici "yerine sabitleme daha katıl" uzak uzak.
Jürgen A. Erhard

12

İnsan tarafından okunabilir farklı bir anlamı vardır.

Ancak, sorgu optimize ediciye bağlı olarak, bunlar makine için aynı anlama gelebilir.

Her zaman okunabilmesi için kod yazmalısınız.

Yani bu yerleşik bir ilişkiyse, açık birleştirme kullanın. zayıf ilişkili verilerle eşleşiyorsanız, where yan tümcesini kullanın.


11

SQL: 2003 standardı bazı öncelik kurallarını değiştirdi, böylece bir JOIN deyimi "virgül" birleşimine göre öncelik kazanır. Bu, sorgunun sonucunu nasıl ayarlandığına bağlı olarak değiştirebilir. Bu, MySQL 5.0.12 standardına bağlı kaldığında bazı insanlar için bazı sorunlara neden olur.

Örneğin, örneğinizde sorgularınız aynı şekilde çalışır. Ancak üçüncü bir tablo eklediyseniz: SELECT ... table1'den, table2 table3'e ON ... NEREDE ... NEREDE ...

MySQL 5.0.12'den önce önce table1 ve table2, sonra table3 birleştirilirdi. Şimdi (5.0.12 ve sonrası), önce table2 ve table3, sonra table1 birleştirilir. Sonuçları her zaman değiştirmez, ancak bunu yapabilir ve siz farkına bile varmayabilirsiniz.

Asla "virgül" sözdizimini kullanmıyorum, ikinci örneğinizi tercih ediyorum. Yine de çok daha okunabilir, JOIN koşulları ayrı bir sorgu bölümüne ayrılmamış JOIN'lerle.


Standart SQL değişmedi. MySQL yanlıştı ve şimdi haklı. MySQL kılavuzuna bakın.
philipxy

4

MySQL hakkında konuştuğunuzu biliyorum, ama yine de: Oracle 9'da açık birleşimler ve örtülü birleşimler farklı yürütme planları oluşturacaktı. Oracle 10+ ile çözülen AFAIK: artık böyle bir fark yok.


1

ANSI birleştirme sözdizimi kesinlikle daha taşınabilir.

Microsoft SQL Server yükseltmesi geçiyorum ve ayrıca SQL Server dış birleşimler için = * ve * = sözdizimi (sql server) ve daha sonraki sürümler için (uyumluluk modu olmadan) desteklenmediğini söyleyebilirim.


2
SQL Server 2000'de bile = ve = yanlış sonuçlar verebilir ve asla kullanılmamalıdır.
HLGEM

2
*=ve =*asla ANSI değildi ve asla iyi bir gösterim değildi. Bu yüzden ON'a ihtiyaç duyuldu - alt seçimlerin yokluğunda DIŞ BİRLEŞTİRMELER için (aynı zamanda eklendi, bu yüzden CROSS & INNER
JOIN'larda

1

Sıklıkla dinamik saklı yordamlar programlıyorsanız, ikinci örneğinize (nerede kullanarak) aşık olacaksınız. Çeşitli giriş parametreleriniz ve çok sayıda morph karışıklığınız varsa, tek yol budur. Aksi takdirde, her ikisi de aynı sorgu planını çalıştıracaktır, bu yüzden klasik sorgularda kesinlikle belirgin bir fark yoktur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.