2011-10-18 13 views
5

Szukałem daleko i szeroko, ale nie mogę znaleźć odpowiedzi, prawdopodobnie dlatego, że nie mogę znaleźć właściwego sposobu, aby zadać pytanie. Więc oto jest: czy istnieje jakikolwiek powód, aby preferować którekolwiek z tych dwóch zapytań?ŁĄCZENIA vs WYBÓR z wielu tabel

SELECT * FROM table1, table2 WHERE table1.id = table2.id; 

i

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id; 

Pytanie wynika z dużo bardziej skomplikowane zapytania, które staram się optymalizować, ale myślę, że te dwie kwerendy zawierają istotę kwestii i mam nadzieję, prosząc w ten sposób będzie bardziej użyteczny dla innych. Z góry dziękuję.

+0

Czy to pierwsze zapytanie działa?Jeśli tak, zakładam, że robi to w milczeniu, ale nie wiem, jakiego typu. – eykanal

+0

To działa, testowałem to przed wysłaniem. ;) – Sophivorus

Odpowiedz

4
SELECT * FROM table1, table2 WHERE table1.id = table2.id; 

i

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id; 

powróci takie same wyniki. Jednak w tym przypadku powinieneś preferować drugi. Pierwsza forma jest nadal powszechnie spotykana, ponieważ Oracle nie obsługiwał drugiego formularza przez długi czas.

Jednak stwierdzając INNER JOIN niesie intencją i siły, aby napisać warunek ponieważ INNER JOIN wymaga klauzuli ON. W przypadku większych zapytań sprawia, że ​​zapytanie jest znacznie bardziej czytelne i utrudnia pominięcie predykatu łączenia.

Należy również pamiętać, że mam skłonność do zapoznania się z pierwszą formę jak: wziąć iloczyn kartezjański dwóch tabel i tylko zachować wiersze, które mają równe identyfikatory w obu tabelach który w SQL jest wyrażona jako SELECT * FROM table1 CROSS JOIN table2 WHERE table1.id = table2.id;.

5

Właściwie te dwa zapytania są takie same, tylko dwa różne sposoby zapisu. Osobiście uważam, że ten drugi daje trochę więcej czytelności dla użytkownika.

+0

Nie wspominając już o tym, że ten pierwszy [jest przestarzały] (http://blogs.technet.com/b/wardpond/archive/2008/09/13/deprecation-of-old-style-join-syntax- only-a-partial-thing.aspx). –

2

Od what I gather oba są takie same. Jednym jest po prostu cukier syntaktyczny dla drugiego.

Znany jest jako notacja jawna i niejawna.

+0

+1 dla słów "wyraźny" a "niejawny". – Benoit

2

Są takie same.

Znaczna część różnic występujących w podstawowym formacie występuje często między różnymi bazami danych, takimi jak Oracle i mySQL. Tradycyjnie w oracle sprzężeń zostały wykonane tylko przy użyciu table.foreign_id = table2.id natomiast mySQL będzie za pomocą table1 join table2 on table1.foreign_key = table2.id

Podobnie join, inner join, left inner join i left join tradycyjnie zróżnicowane trochę z realizacji bazy do wdrożenia więc najlepiej jest sprawdzić w instrukcji/dokument na swój aktualna implementacja bazy danych, aby upewnić się, że robi to, co chcesz.

W bardziej współczesnych czasach składnia stała się bardziej ujednolicona z normami ANSI, ale to, co ludzie często używają, pokazuje ich korzenie!
To dobrze napisany artykuł -
http://www.google.com/url?sa=t&source=web&cd=4&ved=0CD8QFjAD&url=http%3A%2F%2Fwww.kingtraining.com%2Fconfdownloads%2Fdownloads%2FOracle9iJoin_paper.pdf&ei=LOGdTpfiFOrV0QH4zpmECQ&usg=AFQjCNHjicW-tWmJfZcXwNi220LxjGvNhg&sig2=4tdM2lfgQ6AqiYudWWTirg

daje dużo więcej informacji i historię i wyjaśnia różne rodzaje wewnętrzna i zewnętrzna łączy naprawdę dobrze.