Объединения против других методов в MySQL - PullRequest
1 голос
/ 01 декабря 2010

Я полностью самоучка, поэтому в моих знаниях есть очевидные пробелы. Когда мне нужно было получить данные из более чем одной таблицы, я научился делать объединения. Например, если мне нужен номер ваучера, номер счета и баланс из таблицы ваучеров и соответствующий адрес из другой таблицы, я бы сделал это:

select v.voucherNbr, v.balanceInit, v.acctID, a.address, a.city from vouchers v
left join addresses a on v.acctID = a.id

, который будет возвращать все записи ваучеров и любые адреса, которые существуют (в этом случае мы хотим вернуть записи ваучеров, даже если нет соответствующего адреса, следовательно, левое соединение.)

Я недавно унаследовал некоторый код, который, кажется, пытается получить те же данные (и в этом случае он возвращает правильные записи), который делает это так:

select v.voucherNbr, v.balanceInit, v.acctID, a.address, a.city from vouchers v, addresses a 
where v.acctID = a.id

Может ли кто-нибудь объяснить мне последствия этого вместо использования соединения. Как я уже сказал, в данном конкретном случае он возвращает те же данные, что и соединение, но всегда ли это будет?

Ответы [ 2 ]

4 голосов
/ 01 декабря 2010

Просто получилось, что результаты были те же, но в какой-то момент этого не произойдет, поскольку у вашего запроса есть внешнее соединение, а синтаксис, который они вам предоставили, является неявным внутренним соединением.

http://en.wikipedia.org/wiki/Join_(SQL)

3 голосов
/ 01 декабря 2010

Это соединение, просто неявное. Это плохая практика кодирования и должна быть заменена внутренним соединением.

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

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