2013-04-08 18 views

Odpowiedz

10

TABLE C will left join into 1. (TABLE B) or 2. (data from TABLE A LEFT JOIN TABLE B) or 3. (TABLE A)?

Drugi. Ale kodeks łączenia pomoże ci zrozumieć więcej.

Można napisać:

SELECT * 
FROM Table A 
LEFT JOIN TABLE B ON (A.id = B.id) 
LEFT JOIN TABLE C ON (A.ID = C.ID) 

Ale jesteś w stanie:

SELECT * 
FROM Table A 
LEFT JOIN TABLE B ON (A.id = B.id) 
LEFT JOIN TABLE C ON (A.id = C.id and B.code = C.code) 

Tak, można przystąpić na każdym polu z poprzednich tabelach i dołączyć na „wynik” (choć silnik może wybrać sposób uzyskania wyniku) poprzednich sprzężeń.

Pomyśl o sprzężeniu z lewej strony jako o działaniu niezespolonym (A left join B to nie to samo, co B left jon A) Zatem kolejność jest ważna, a punkt C zostanie połączony przy poprzednich połączonych tabelach.

4

Oracle documentation jest dość specyficzny temat, w jaki sposób łączy są przetwarzane:

To execute a join of three or more tables, Oracle first joins two of the tables based on the join conditions comparing their columns and then joins the result to another table based on join conditions containing columns of the joined tables and the new table. Oracle continues this process until all tables are joined into the result.

To podejście logika do obsługi sprzężeń i jest zgodny ze standardem ANSI (innymi słowy, cały proces silniki bazodanowe sprzężeń w celu).

Jednak, gdy zapytanie jest rzeczywiście wykonane, optymalizator może wybrać łączenie w innym porządku. Wynik musi być logicznie taki sam jak przetwarzanie sprzężeń w kolejności podanej w zapytaniu.

Również warunki łączenia mogą spowodować powstanie nieoczekiwanych warunków. Więc jeśli masz:

from A left outer join 
    B 
    on A.id = B.id left outer join 
    C 
    on B.id = C.id 

Następnie może mieć stan, w którym A i C każdy ma wiersz z danym identyfikatorem, ale B nie. W przypadku tego sformułowania wiersz C nie zostanie wyświetlony, ponieważ łączy się z NULL. Należy więc zachować ostrożność w warunkach łączenia pod numerem left outer join, szczególnie w przypadku łączenia z tabelą inną niż pierwsza tabela w łańcuchu.

+0

Późna notatka: Odmianą tego jest "transformacja gwiazdowa", w której zestaw predykatów jest stosowany do tabeli faktów przez wnioskowanie z określonych połączeń do tabel wymiarów i zastosowane do niego przed przystąpieniem do wymiarów. –

1

Musisz poprawnie podać nazwę kolumny, aby uruchomić zapytanie. Przejdźmy powiedzieć, jeśli używasz:

SELECT * 
FROM Table A 
LEFT JOIN TABLE B ON (A.id = B.id) 
LEFT JOIN TABLE C ON (A.id = C.id and B.code = C.code) 

Wtedy może pojawić się następujący błąd:

ORA-00933:SQL command not properly ended.

więc aby tego uniknąć można spróbować:

Dzięki

Powiązane problemy