Разница между объединением и отсутствием выбора? - PullRequest
1 голос
/ 19 ноября 2009

Я не вижу разницы между двумя запросами ниже:

query_join = select a.id, b.name, a.telephone, a.description  from tb_industry a   left outer join tb_sector b on a.sector_id = b.id 
query_select = select a.id, b.name, a.telephone, a.description from tb_industry a , tb_sector b WHERE a.sector_id = b.id

Результат точно такой же. Теперь я предполагаю, что это может произойти, но я хотел бы получить представление о том, в каких ситуациях лучше всего использовать только query_join, а в каких ситуациях лучше всего использовать query_condition?

Ответы [ 7 ]

4 голосов
/ 19 ноября 2009

Первое - это НАРУЖНОЕ соединение. Это показывает строки из таблицы A, даже если в таблице B. нет соответствующей строки. Предположим, что таблицы содержат следующие данные:

select a.name, a.sector_id from tb_industry a;

name  sector_id
----  ---------
A     1
B     2
C     3

Select b.id, b.name from tb_sector b;

id  name
--  ----
1   X
2   Y

(обратите внимание, что строки tb_sector с идентификатором 3 не существует.)

Внешнее объединение по-прежнему возвращает все строки из таблицы A с NULL для значений, которые должны были прийти из таблицы B:

select a.name, a.sector_id, b.name as sector_name
from tb_industry a left outer join tb_sector b on a.sector_id = b.id;

name  sector_id  sector_name
----  ---------  -----------
A     1          X
B     2          Y
C     3

Другой запрос (соединение INNER) пропускает несопоставленную строку:

select a.name, a.sector_id, b.name as sector_name
from tb_industry , tb_sector b where a.sector_id = b.id;

name  sector_id  sector_name
----  ---------  -----------
A     1          X
B     2          Y

Следующий запрос также является внутренним соединением с использованием более нового синтаксиса соединения ANSI:

select a.name, a.sector_id, b.name as sector_name
from tb_industry a
join tb_sector b on a.sector_id = b.id;

name  sector_id  sector_name
----  ---------  -----------
A     1          X
B     2          Y

Без ключевого слова OUTER объединение является внутренним объединением.

2 голосов
/ 19 ноября 2009

Они не одинаковы, хотя они могут возвращать один и тот же результат в зависимости от ваших данных.

Первым является левое внешнее соединение, поэтому будут возвращаться строки, если соответствующая таблица не имеет соответствующей записи.

Второе по сути является внутренним соединением, поэтому не будет возвращать строки, если в обеих таблицах нет совпадающих записей.

Это зависит от ваших предпочтений, но синтаксис первого типа легче читать, когда запросы сложные.

0 голосов
/ 19 ноября 2009

Ваш запрос на соединение с левым внешним объединением принесет даже несопоставленные записи из базы данных.

Ваш второй запрос принесет только совпадающие результаты.

0 голосов
/ 19 ноября 2009

A левое внешнее соединение отличается от обычного соединения.

Результат левого внешнего соединения (или просто левого соединения) для таблиц A и B всегда содержит все записи "левой" таблицы (A), даже если условие соединения не находит ни одной подходящей записи в " правый «стол» (Б).

0 голосов
/ 19 ноября 2009

Объединения - более новый синтаксис для выражения отношений в запросах. Они предлагают преимущество внешних объединений, которые на самом деле невозможны в предложении where (для этого у Oracle было расширение языка путем добавления (+) к фильтру, но оно было очень ограниченным и не очень простым для понимания). При использовании внутренних объединений это не имеет значения, результат тот же.

Это субъективно, но, по моему мнению, объединения гораздо легче читать.

0 голосов
/ 19 ноября 2009

Если они возвращают одинаковые результаты для вас, тогда каждый элемент в tb_industry имеет элемент в tb_sector. Ваш второй запрос неверен для эквивалента левого соединения, которое будет a.sector_id * = b.sector_id.

Синтаксис * = устарел и более не используется в более новых СУБД.

0 голосов
/ 19 ноября 2009

Вы используете соединения, когда хотите получить все результаты из таблицы, из которой вы выбираете, и значения из левой или правой таблицы (LEFT JOIN, RIGHT JOIN), когда есть совпадения.

Когда вы хотите явное совпадение, вы используете стиль условия запроса.

Надеюсь, это поможет! В w3schools есть несколько простых и базовых примеров.

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