Следует ли использовать ключевое слово sql JOIN для сложных объединений в нескольких таблицах? - PullRequest
9 голосов
/ 10 марта 2009

У меня есть следующий запрос:

select * 
    from tbA A, tbB B, tbC C, tbD D
where 
    A.ID=B.ID and B.ID2= C.ID2 and A.ID=D.ID and C.ID3=D.ID3 and B.ID4=D.ID4
and
    A.Foo='Foo'

Я несколько раз слышал, что этот синтаксис объединения устарел, и что вместо этого я должен использовать ключевое слово JOIN.

Как мне это сделать в таком сложном соединении (несколько таблиц объединяются в несколько столбцов, принадлежащих разным таблицам)? Как вы думаете, эта лучшая практика все еще применяется здесь?

Ответы [ 4 ]

11 голосов
/ 10 марта 2009

Это дело вкуса, но мне больше нравится ключевое слово JOIN. Это делает логику более понятной и более совместимой с синтаксисом LEFT OUTER JOIN, который идет вместе с ней. Обратите внимание, что вы также можете использовать INNER JOIN, который является синонимом JOIN.

Синтаксис

   a JOIN b
    ON expression relating b to all of the tables before

b может быть само соединение. Для внутренних объединений это не имеет значения, но для внешних вы можете контролировать порядок соединений следующим образом:

select * from
   a left join
      d join c
      on d.i = c.i
   on a.k = d.k 

Здесь a присоединяется слева к внутреннему соединению между d и c.

Вот ваш запрос:

select * 
    from tbA A
    join tbB B on A.ID = B.ID
    join tbC C on B.ID2 = C.ID2
    join tbD D on A.ID = D.ID and C.ID3 = D.ID3 and B.ID4 = D.ID4
where 
    A.Foo='Foo'
5 голосов
/ 10 марта 2009

Синтаксис объединения гораздо проще понять

select *
from tbA A
inner join tbB B on a.id = b.id
inner join tbC C on b.id2 = c.id2
inner join tbD D on a.id = d.id and c.id3 = d.id3 and b.id4 = d.id4
where A.Foo='Foo'

Теперь вы можете ясно видеть, как данные объединяются и что это не очень сложное объединение в целом.

Кстати, дизайн базы данных в вашем примере сильно пахнет отсутствием нормализации. Обычно у вас должна быть одна таблица, соединяющая несколько (соединение b на a.bid = b.bid, соединение c на a.cid = c.cid) или цепочка (соединение b на a.bid = b.bid соединение c на b.cid = c.cid).

EDIT. Добавлено необязательное ключевое слово INNER, которое не меняет результат, но делает его более понятным.

2 голосов
/ 10 марта 2009
Синтаксис

JOIN более четкий (хотя я лично предпочитаю синтаксис WHERE в простых случаях) и, что более важно, может обрабатывать объединения INNER и OUTER более понятным способом.

WHERE не считается устаревшим и, вероятно, никогда не будет.

Это устарело только в том смысле, что различные OUTER JOIN обходные пути (например, (*) и (+)) устарели.

Вы ничего не можете сделать с JOIN, что вы можете сделать с WHERE, но не наоборот.

2 голосов
/ 10 марта 2009
SELECT * 
FROM tba AS a
    JOIN tbb AS b ON a.id = b.id
    JOIN tbc AS c ON b.id2 = c.id2
    JOIN tbd AS d ON a.id = d.id AND c.id3 = d.id3 AND b.id4 = d.id4
WHERE 
    a.foo = 'Foo'

Хотя мне трудно представить, что в этом есть необходимость. Голый, чтобы привести пример, или ах более описательные имена таблиц?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...