2010-11-04 52 views
0

使用INNER 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

請格式化你的查詢,兩者的差異是比較容易看到。 – Welbog 2010-11-04 20:01:22

+0

@Ponies:道歉編輯衝突。 – bernie 2010-11-04 20:03:58

回答

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

+0

嘿!我只是......謝謝。 77行受到影響。 :-) 感謝您的解釋! – B4NZ41 2010-11-04 20:15:24

6

這兩個查詢之間的區別在於新查詢也在訪問atend_os表。因此,atendimento.cliente的任何值也不會以cliente.id的形式出現。

INNER JOIN要求值存在於兩個表中或行被丟棄。

+0

一個LEFT JOIN解決了這個問題。感謝您的解釋! – B4NZ41 2010-11-04 20:18:35

3

很顯然,這個表atend_os不包含每一個atend_mento的記錄。也許你需要一個左連接?

+0

是的,左加入解決了問題jst罰款 – B4NZ41 2010-11-04 20:19:27