Eu estou olhando para esta consulta SQL herdada. O pouco que não consigo entender é por que é interno juntando a mesma tabela duas vezes nas mesmas colunas. Eu estou falando sobre Table1 e Table1 juntou-se ao alias "Table1Alias",
SELECT DISTINCT othercolumns,
Table1Alias.columna
FROM maintable
INNER JOIN secondarytable
ON maintable.id1 = secondarytable.a_id1
INNER JOIN table1
ON secondarytable.id2 = table1.id3
INNER JOIN table1 Table1Alias
ON secondarytable.id2 = Table1Alias.id3
INNER JOIN thirdtable
ON table1.id4 = thirdtable.id5
INNER JOIN fourthtable
ON thirdtable.id6 = fourthtable.id7
INNER JOIN fivetable
ON thirdtable.id8 = fivetable.id9
INNER JOIN sixthtable
ON Table1Alias.columna = sixthtable.id10
LEFT JOIN seventhtable
ON thirdtable.id11 = seventhtable.id12
WHERE LEFT(secondarytable.type123, 2) BETWEEN '01' AND '09'
AND secondarytable.type456 = 'cate'
AND table1.type = '0'
AND Table1Alias.columna = 'conn'
sql-server
Matemática
fonte
fonte
Respostas:
Pode ajudar a reescrever a consulta assim, portanto, é óbvio que as 2 junções são diferentes , ou seja, as junções são para subconjuntos diferentes (da mesma tabela):
fonte
INNER JOIN (SELECT * FROM table1 WHERE type = 0) table1
. Isso pode tornar ainda mais óbvio o que está acontecendo.ON
cláusula de uma junção ou naWHERE
cláusula pode ter grande importância se a junção for umOUTER JOIN
. Se uma condição falhar naON
cláusula, a linha principal ainda será incluída (sem uma linha externa correspondente); se falhar naWHERE
cláusula, a linha principal será excluída do conjunto de resultados.Observando a
where
cláusula, a linha apontada portable1
requer a colunatype
= '0' e a linha apontada portable1alias
requer a colunacolumna
= 'conn'.Talvez haja várias linhas
table1
para o mesmoid3
?fonte
Sem ver a estrutura da tabela - a abordagem poderia ser a utilização de um índice menor de cobertura e, em seguida, ingressar na tabela em um índice de cobertura maior para obter o restante das linhas para evitar uma operação de 'Key Lookup' e para modificar os índices existentes. (ou se você não pode modificar os índices)
fonte
Sempre que uma tabela aparece mais de uma vez em uma associação complexa, geralmente ocorre porque existe uma entidade que participa de mais de um relacionamento. Parece ser esse o caso aqui, a julgar pela resposta que o @Ypercube deu.
Entidades e relacionamentos são geralmente entendidos através da semântica dos dados e da conexão com o assunto subjacente. Se o seu sistema legado foi cuidadosamente construído, eles provavelmente tomaram alguns cuidados para analisar o assunto e definir cuidadosamente cada um dos elementos de dados. Eles podem até ter construído um modelo de Entidade-Relacionamento. Todo esse trabalho cuidadoso pode ter sido perdido, e você não consegue reconstruí-lo cavando o passado. Isto é um pouco como arqueologia.
Com nomes de tabelas como Tabela1, não temos idéia de como o assunto funciona. E mesmo que os nomes sejam descritivos, nosso entendimento do assunto do seu sistema pode ser muito diferente do necessário no seu caso. Vai depender de você.
fonte