Применяется ли сначала LEFT JOIN к нескольким JOIN? - PullRequest
0 голосов
/ 10 января 2012

У меня есть кратное JOIN в виде

SELECT * FROM column1
  LEFT JOIN column2 USING(id)
  JOIN column3 USING(name)
  JOIN column4 USING(info)
  WHERE column1.id = 44

При изменении LEFT JOIN на JOIN;по очевидной причине запрос ничего не даст при отсутствии column2.id.Основные данные - это столбец 1, а остальные - вспомогательные данные;таким образом, я хочу получить данные, только если существует column1.id.

Мой вопрос: гарантирует ли первый LEFT JOIN запрос на возврат значений column1, если существует column1.id, независимо от последующих JOIN s(например, когда column3.name не существует)?Или мне нужно изменить следующие (все) JOIN s на LEFT JOIN тоже?

Ответы [ 3 ]

2 голосов
/ 10 января 2012

У вас есть несколько вариантов, так как прямой ответ на ваш вопрос: no.

Измените все последующие объединения на ЛЕВЫЕ СОЕДИНЕНИЯ.

SELECT * FROM column1
  LEFT JOIN column2 USING(id)
  LEFT JOIN column3 USING(name)
  LEFT JOIN column4 USING(info)
  WHERE column1.id = 44

Если возможно, измените расположениезапрос ...

SELECT * FROM column1
  JOIN column3 USING(name)
  JOIN column4 USING(info)
  LEFT JOIN column2 USING(id)
  WHERE column1.id = 44

Или ...

SELECT * FROM column1
  JOIN
  (
       column3
  JOIN column4 USING(info)
  LEFT JOIN column2 USING(id)
  )
    USING(name)
  WHERE column1.id = 44

Кстати, я бы избегал естественных объединений и синтаксиса USING.Логика менее прозрачна, она более открыта для ошибок, более открыта для последующего разрыва (если вы добавляете поле в одну из таблиц, дублирующих поле в опции USING), и т. Д., И т. Д.

1 голос
/ 10 января 2012

Они "соединяются в цепочку", поэтому их всех нужно оставить соединенными.

0 голосов
/ 10 января 2012

Вам понадобятся left с.

Каждый JOIN будет пытаться объединить результаты из предыдущих объединений в следующую таблицу.

Вы можете думать, что запрос так:

  ((column1
    LEFT JOIN column2 USING(id)
    )
  JOIN column3 USING(name)
  )
  JOIN column4 USING(info)
  WHERE column1.id = 44
...