Nesta consulta SQL:
SELECT retorno_pedido.emissao, retorno_pedido.qtd_itens, retorno_pedido.valor_pedido,
retorno_pedido.id_pedido AS id_pedido, pedidos.id_cliente, clientes.nome
FROM retorno_pedido
LEFT OUTER JOIN pedidos ON retorno_pedido.id_pedido = pedidos._id
LEFT OUTER JOIN clientes ON pedidos.id_cliente = clientes._id
Como funciona os Join? Eu sei que ele serve para fazer consulta unindo tabelas. Mas na consulta acima ele me retornou 6 registros, mas se eu inverter a ordem dos Join assim:
SELECT retorno_pedido.emissao, retorno_pedido.qtd_itens, retorno_pedido.valor_pedido,
retorno_pedido.id_pedido AS id_pedido, pedidos.id_cliente, clientes.nome
FROM retorno_pedido
LEFT OUTER JOIN clientes ON pedidos.id_cliente = clientes._id
LEFT OUTER JOIN pedidos ON retorno_pedido.id_pedido = pedidos._id
é me retornado 150 registros.
Isso acontece porque você está usando a LEFT OUTER JOIN. Nesse tipo de JOIN, a query sempre retorna todos os registros da tabela à esquerda da JOIN, independentemente de haver correspondência ou não na tabela mais à direita. Por exemplo, se a ordem da JOIN for clientes x pedidos, a consulta retornará todos os clientes, mesmo aqueles que não tem pedido. Por outro lado, se a ordem da JOIN for pedidos x clientes, então ela retornará os pedidos e somente então fará a correspondência com clientes.
Embora pareça estranho, em alguns casos esse comportamento da LEFT JOIN é desejado, mas estes casos são exceções. Na maioria dos casos, utiliza-se a INNER JOIN, que retorna linhas somente se houver ligação entre as tabelas.
Entendi, mas no caso que mostrei acima, o número de registros é retornado diferente não quando inverto a ordem de esquerdo e direito do LEFT OUTER JOIN. Repare que tenho dois LEFT OUTER JOIN. E a quantidade de registros muda quando o segundo LEFT OUTER JOIN passa a ser o primeiro…
Mas é exatamente esse o caso. O banco de dados executa as JOINS aos pares, no seu caso, a ordem das LEFT JOINs é retorno_pedido x pedidos x clientes, que é executado na ordem ((retorno_pedido x pedidos) x clientes). Quando você inverte a ordem das LEFT JOINs a execução é ((retorno_pedido x clientes) x pedidos).