/ / SQL: Właściwy protokół JOIN - sql, sql-server, join

SQL: Właściwy protokół JOIN - sql, sql-server, join

Mam następujące tabele z następującymi atrybutami:

Op(OpNo, OpName, Date)
OpConvert(OpNo, M_OpNo, Source_ID, Date)
Source(Source_ID, Source_Name, Date)
Fleet(OpNo, S_No, Date)

Mam aktualną kwerendę JOIN, która daje mi wyniki, które chcę:

SELECT O.OpNo AS Op_NO, O.OpName, O.Date AS Date_Entered, C.*
FROM Op O
LEFT OUTER JOIN OpConvert C
ON O.OpNo = C.OpNo
LEFT OUTER JOIN Source D
ON C.Source_ID = D.Source_ID
WHERE C.OpNo IS NOT NULL

Problem polega na tym. Muszę dołączyć do tabeli Fleet w poprzednim wielokrotnym poleceniu JOIN, aby dołączyć odpowiednie S_No do tabeli wielu JOIN. Czy nadal byłbym w stanie to osiągnąć za pomocą LEWEGO ZŁĄCZA ZEWNĘTRZNEGO, czy też musiałbym użyć innej instrukcji JOIN? Poza tym, przy którym stole JUŻ DOŁĄCZam?

Pamiętaj, że znam tylko LEFT OUTER JOINS.

Dzięki.

Odpowiedzi:

2 dla odpowiedzi № 1

Myślę, że w twoim przypadku możesz użyć INNER JOIN lub LEFT JOIN (co jest tym samym co LEFT OUTER JOIN w SQL Server.

  • INNER JOIN oznacza, że ​​będzie zwracał rekordy tylko z innych tabel tylko wtedy, gdy istnieją odpowiednie rekordy (w oparciu o warunek łączenia) w Fleet stół.
  • LEFT JOIN oznacza, że ​​zwróci rekordy z innych tabel, nawet jeśli nie ma odpowiednich rekordów (w oparciu o warunek łączenia) w Fleet stół. Wszystkie kolumny z Fleet zwróci NULL w tym przypadku.

Jeśli chodzi o tabelę, do której należysz, powinieneś naprawdę dołączyć do tabeli, która ma bardziej logiczny sens w oparciu o twoją strukturę danych.


2 dla odpowiedzi nr 2

Tak, możesz użyć wszystkich tabel wymienionych wcześniejtwoje warunki przyłączenia. W rzeczywistości, JOINS (bez względu na INNER, LEFT OUTER, RIGHT OUTER, CROSS, FULL OUTER lub cokolwiek innego) pozostają lewostronne, asocjacyjne. mi. są one implicite oceniane tak, jakby były umieszczone w nawiasach od lewej strony w następujący sposób:

FROM ( ( ( Op O
LEFT OUTER JOIN OpConvert C
ON O.OpNo = C.OpNo
)
LEFT OUTER JOIN Source D
ON C.Source_ID = D.Source_ID
)
LEFT OUTER JOIN Fleet
ON ...
)

Jest to podobne do tego + lub - domyślnie używał nawiasów, mi.

2 + 3 - 4 - 5

jest oceniany jako

(((2 + 3) - 4) - 5)

Przy okazji: Jeśli używasz C.OpNo IS NOT NULL, a później LEFT OUTER JOIN Source D traktowany jest jak gdyby był INNER JOIN, ponieważ wyraźnie usuwasz wszystkie wiersze "ZEWNĘTRZNE".