Eu li em todo lugar que as junções são associativas e comutativas.
Então A join (B join C)
deve ser o mesmo que (A join C) join B
.
Mas tenho muita dificuldade em entender como isso pode ser assim. Suponha que A tenha uma propriedade em comum com B e B tenha uma propriedade em comum com C, mas A e C não compartilhem propriedades comuns para unir.
Parece que nesse caso, na segunda instância (A join C) join B
, quando ocorresse a operação de junção de A e C resultaria em um conjunto vazio, impossibilitando a junção com B.
Considerando que no primeiro caso funcionaria porque B juntar C resultaria na tabela unida esperada que teria uma propriedade para unir com A.
Você fez uma suposição incorreta.
Se três é uma relação entre
A
eB
, e entreB
eC
mas nenhuma relação entreA
eC
, juntarA
eC
não lhe dá nenhuma linha. Na verdade, ele fornece m * n linhas, onde m é o número de linhas emA
e n é o número de linhas emB
.torna-se, se juntarmos
A
eC
primeiro:NOTA: A faculdade foi há mais de 30 anos - espero que você entenda conceitualmente e possa reescrever na sintaxe correta para a álgebra relacional real.
Se você tiver 20 linhas em
A
, 30 emB
e 40 emC
, e cada linha emB
corresponder a uma e apenas uma linha emA
, e cada linha emC
corresponder a uma e apenas uma linha emB
. Ao entrarA
emB
, você receberá 30 linhas de volta; quando você juntar essas 30 linhas aC
, você receberá 40 linhas de volta.Se você ingressar primeiro
A
emC
, sem nenhum relacionamento para definir quais pares de linhas são válidos , você receberá de volta todos os pares de linhas possíveis - 800 linhas. Quando nos juntamosB
às 800 linhas, a conexão entreB
eA
significa que uma linhaB
pode corresponder apenas àsAC
linhas que incluem umaA
linha específica - haverá 40 delas (uma para cadaC
linha). Desses 40, as únicas correspondências reais são aquelas em que a conexão entreB
eC
também é válida. E sabemos que asC
linhas que correspondem àB
linha atual não podem corresponder a nenhuma outraB
linha. Então, para umaB
linha, podemos ter 2AC
linhas que correspondem, por mais 4, por mais apenas 1.Dito isso, sabemos que cada
C
linha corresponde a uma (e apenas uma)B
linha, portanto, o número total de correspondências chegará a 40 novamente - as mesmas 40 correspondências como se tivéssemos as primeiras correspondênciasA
eB
, ouB
eC
.Então - a condição em uma junção não informa quais linhas correspondem - ela realmente informa quais linhas não correspondem. Retire-o e você terá um
CROSS JOIN
- o produto vetorial das linhas nas duas tabelas.Considerando
A associatividade da junção pode ser visualmente provada com o diagrama de Venn da seguinte forma:
A comutatividade da junção pode ser visualmente provada com o diagrama de Venn da seguinte forma:
Atualização
(anteriormente, o diagrama tinha ∩ em vez de ⋈. A explicação abaixo foi feita no contexto de ∩.)
Obrigado @Lennart por apontar nos comentários que
Acho que mais explicações precisam ser fornecidas, pois
INTERSECT
a operação não é exatamente a mesma queINNER JOIN
. Quero destacar os seguintes pontos do link:INTERSECT
O operador retorna quase os mesmos resultados que aINNER JOIN
cláusula muitas vezes.Ao usar
INTERSECT
o operador, o número e a ordem das colunas devem ser os mesmos em todas as consultas, bem como o tipo de dados deve ser compatível. Mas isso não tem efeito no diagrama de Venn acima se considerar o que eu disse explicitamente no terceiro ponto acima:Então, por símbolo ∩ eu realmente quis dizer juntar, não cruzar e com este ponto em consideração, a junção seguirá o comportamento da interseção do conjunto. Acho que o erro que cometi foi usar o símbolo ∩ em vez de ⋈. Eu não tinha
INTERSECT
a operação em mente enquanto escrevia a resposta. Eu usei por intuição como "interseção lógica de dois conjuntos", mas não como "INTERSECT
operação de banco de dados".INNER JOIN
pode simular comINTERSECT
quando usado comDISTINCT
. Mas mesmo se não incluirmosDISTINCT
e mantivermos comoINNER JOIN
, o diagrama de Venn ainda será válido, pois a interseção de dois círculos/conjuntos também conterá registros duplicados.Observe também que esta resposta tenta explicar a associatividade da junção externa esquerda usando uma abordagem semelhante ao diagrama de Venn.
Para encerrar, honestamente, sinto que devo trocar o símbolo ∩ por ⋈.