有INNER JOIN限制吗?

时间:2010-11-04 19:59:49

标签: sql mysql join

使用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 个答案:

答案 0 :(得分:6)

两个查询之间的区别在于新查询也在访问atend_os表。因此,任何不属于atendimento.cliente的{​​{1}}值都会被过滤掉。

cliente.id要求两个表中都存在该值,否则该行将被丢弃。

答案 1 :(得分:3)

显然这个表atend_os不包含每个atendimento的记录。也许你需要一个左连接?

答案 2 :(得分:3)

 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