Eu tenho uma junção externa esquerda muito básica para retornar todos os resultados da tabela esquerda e algumas informações adicionais de uma tabela muito maior. A tabela da esquerda ainda contém 4935 registros. Quando eu deixei o JOIN em uma tabela adicional, a contagem de registros é significativamente maior.
Até onde eu sei, é um evangelho absoluto que um LEFT OUTER JOIN retornará todos os registros da tabela da esquerda com registros correspondentes da tabela da direita e valores nulos para qualquer linha que não possa ser correspondida; portanto, é meu entendimento que deve será impossível retornar mais linhas do que as existentes na tabela esquerda, mas isso está acontecendo da mesma forma!
A consulta SQL segue:
SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID
FROM SUSP.Susp_Visits LEFT OUTER JOIN
DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum
Talvez eu tenha cometido um erro na sintaxe ou meu entendimento de LEFT OUTER JOIN esteja incompleto, espero que alguém possa explicar como isso pode estar ocorrendo?
Postscript
Obrigado pelas ótimas respostas, meu entendimento de LEFT OUTER JOINS agora é muito melhor. Alguém poderia sugerir uma maneira de modificar essa consulta para que eu receba o máximo de registros retornados na tabela à esquerda?
Essa consulta é puramente para gerar um relatório e as correspondências duplicadas simplesmente confundem as coisas.
/ Postscript
fonte
Respostas:
A ESQUERDA EXTERNA ESQUERDA retornará todos os registros da tabela ESQUERDA associados à tabela DIREITA sempre que possível.
Se houver correspondências, no entanto, ainda retornará todas as linhas correspondentes, portanto, uma linha na ESQUERDA que corresponda a duas linhas à DIREITA retornará como duas LINHAS, assim como um INNER JOIN.
EDIT: em resposta à sua edição, acabei de dar uma olhada na sua consulta e parece que você está retornando apenas dados da tabela ESQUERDA. Portanto, se você deseja apenas dados da tabela ESQUERDA e deseja apenas uma linha retornada para cada linha na tabela ESQUERDA, não é necessário executar uma JOIN e pode fazer um SELECT diretamente da tabela ESQUERDA.
fonte
Resultados:
fonte
Não é impossível. O número de registros na tabela esquerda é o número mínimo de registros que ele retornará. Se a tabela da direita tiver dois registros que correspondem a um registro na tabela esquerda, ela retornará dois registros.
fonte
Em resposta ao seu postscript, isso depende do que você gostaria.
Você está obtendo (possível) várias linhas para cada linha na tabela esquerda porque existem várias correspondências para a condição de associação. Se você deseja que o total de resultados tenha o mesmo número de linhas que existe na parte esquerda da consulta, verifique se as condições de junção causam uma correspondência 1 para 1.
Como alternativa, dependendo do que você realmente deseja, você pode usar funções agregadas (se, por exemplo, você quiser apenas uma string da parte direita, poderá gerar uma coluna que é uma string delimitada por vírgula dos resultados do lado direito da linha esquerda.
Se você estiver visualizando apenas 1 ou 2 colunas da junção externa, poderá considerar o uso de uma subconsulta escalar, pois você terá 1 resultado garantido.
fonte
Cada registro da tabela à esquerda será retornado quantas vezes houver registros correspondentes na tabela à direita - pelo menos 1, mas pode facilmente ser mais que 1.
fonte
ESQUERDO OUTER JOIN, assim como INNER JOIN (junção normal) retornará tantos resultados para cada linha na tabela esquerda quantas correspondências encontrar na tabela à direita. Portanto, você pode obter muitos resultados - até N x M, onde N é o número de linhas na tabela esquerda e M é o número de linhas na tabela direita.
É o número mínimo de resultados sempre garantido em LEFT OUTER JOIN para que seja pelo menos N.
fonte
Poderia ser uma relação de um para muitos entre as tabelas esquerda e direita?
fonte
Preste atenção se você tiver uma cláusula where na tabela "lado direito" de uma consulta que contenha uma junção externa esquerda ... Caso você não tenha nenhum registro no lado direito que satisfaça a cláusula where, o registro correspondente do lado esquerdo 'tabela não aparecerá no resultado da sua consulta ....
fonte
Se você precisar de apenas uma linha do lado direito
ou apenas
fonte
Parece que existem várias linhas na tabela DATA.Dim_Member por linha SUSP.Susp_Visits.
fonte
se várias (x) linhas em Dim_Member estiverem associadas a uma única linha em Susp_Visits, haverá x linhas no conjunto de resultados.
fonte