Есть ли ограничения по внутреннему соединению? - PullRequest
0 голосов
/ 04 ноября 2010

Есть ли предел для использования INNER JOIN?

Оригинальный запрос (Работает просто отлично) Я получил 77 строк затронутых

    SELECT atendimento.id, atendimento.responsavel, atendimento.ocorrencia, 
           atendimento.idcontrato, cliente.nome as clinome, cliente.id as cliid, 
           atendimento.d_ini, usuario.apelido, tipos.descricao, tipos.id as tip 
      FROM atendimento 
INNER JOIN cliente ON atendimento.cliente=cliente.id 
INNER JOIN usuario ON atendimento.usuario=usuario.id 
INNER JOIN tipos ON atendimento.status=tipos.id 
     WHERE 1=1 AND (atendimento.status=10 OR atendimento.status=11) 
  ORDER BY tipos.id, atendimento.d_ini ASC

Новая попытка: (не очень хорошо работает) ограничено только 17 строками.Результат здесь тот же, за исключением только 17 строк, возвращенных в моем запросе.

    SELECT atendimento.id, atendimento.responsavel, atendimento.ocorrencia, 
           atendimento.idcontrato, atend_os.protocolo, atend_os.tecnico, 
           cliente.nome as clinome, cliente.id as cliid, atendimento.d_ini, 
           usuario.apelido, tipos.descricao, tipos.id as tip 
      FROM atendimento 
INNER JOIN atend_os ON atendimento.id=atend_os.protocolo 
INNER JOIN cliente ON atendimento.cliente=cliente.id 
INNER JOIN usuario ON atendimento.usuario=usuario.id 
INNER JOIN tipos ON atendimento.status=tipos.id 
     WHERE 1=1 AND (atendimento.status=10 OR atendimento.status=11) 
  ORDER BY tipos.id, atendimento.d_ini ASC

Что здесь не так?кто-то знает, почему результат меняется?

Большое спасибо за любую информацию!

Ответы [ 3 ]

6 голосов
/ 04 ноября 2010

Разница между этими двумя запросами заключается в том, что новый запрос также обращается к таблице atend_os.Таким образом, любые значения atendimento.cliente, которые также не существуют как cliente.id, фильтруются.

INNER JOIN требует, чтобы значение существовало в обеих таблицах или строка была отброшена.*

3 голосов
/ 04 ноября 2010

попробуйте

 SELECT atendimento.id, atendimento.responsavel, atendimento.ocorrencia, 
           atendimento.idcontrato, atend_os.protocolo, atend_os.tecnico, 
           cliente.nome as clinome, cliente.id as cliid, atendimento.d_ini, 
           usuario.apelido, tipos.descricao, tipos.id as tip 
      FROM atendimento 
INNER JOIN cliente ON atendimento.cliente=cliente.id 
INNER JOIN usuario ON atendimento.usuario=usuario.id 
INNER JOIN tipos ON atendimento.status=tipos.id 
LEFT JOIN atend_os ON atendimento.id=atend_os.protocolo 
     WHERE 1=1 AND (atendimento.status=10 OR atendimento.status=11) 
  ORDER BY tipos.id, atendimento.d_ini ASC

и посмотрите, сколько строк имеют atend_os.protocolo = NULL

3 голосов
/ 04 ноября 2010

Видимо, эта таблица atend_os не содержит записи для каждого атендименто. Возможно, вам нужно левое соединение?

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