Digamos que temos duas tabelas 'Fornecedores' e 'Faturas'. Entendo que um motivo para fazer uma junção à esquerda de 'Fornecedores' com 'Faturas' ao longo da coluna VendorID é obter informações sobre fornecedores sem faturas. Uma junção à direita é basicamente uma junção à esquerda com tabelas trocadas (essa é a principal motivação, certo)?
Mas não consigo ver uma motivação geral de cross joins nesse sentido, ou seja, se eu receber tabelas Vendors, Invoices unidas ao longo VendorID como acima, que informação é que Vendors Cross Join me permite obter que não posso obter através de uma junção esquerda , ou então?
Obrigado.
Um CROSS JOIN fornece o produto cartesiano de todas as linhas nas duas tabelas e, em seguida, aplica qualquer filtragem da cláusula WHERE. Raramente serve a um propósito para seus relacionamentos de mesa mais comuns, mas há algumas ocasiões em que é útil.
Por exemplo, pode ser necessário atribuir relacionamentos entre uma tabela estática de Propriedades e alguns Itens armazenados em outra tabela. A maneira mais fácil de adicionar um novo item e relacionar suas propriedades necessárias seria inserir os resultados de um CROSS JOIN entre as duas tabelas em uma tabela de vinculação entre elas. Valores específicos para essas propriedades poderiam ser adicionados posteriormente por meio de outras interfaces, mas eles já teriam a estrutura atribuída sem a necessidade de codificar a interface.
CROSS JOINs são geralmente usados para explodir um conjunto de dados para produzir um grande número de linhas. Por exemplo, eu uso CROSS JOINs para criar minhas tabelas Numbers .
Existem outros propósitos práticos, no entanto. Digamos que você tenha uma tabela de permissões:
Agora, você provavelmente tem um mapeamento de tabela UserID -> PermissionID, mas isso não é realmente necessário para usuários administrativos. Portanto, nesse caso, você pode ter a seguinte consulta (digamos que o aplicativo precise de permissões granulares para cada usuário ou que você tenha exceções para usuários específicos que pode aplicar posteriormente, etc.):
Isso produzirá um conjunto de linhas (número de usuários administradores * número de permissões), com todas as permissões listadas para cada usuário administrador. Isso evita que você tenha que armazenar cada conjunto único e também significa que não precisa atualizar todos os usuários administradores ao adicionar ou remover uma permissão.
(Este não é um exemplo super prático, porque o aplicativo pode ser escrito de forma a reconhecer um usuário administrador, mas digamos que o aplicativo não possa ser alterado.)
Como um aparte, resista à tentação de usar um RIGHT JOIN. Atenha-se à ESQUERDA, é uma maneira muito mais simples de pensar sobre relacionamentos conceitualmente IMHO. Toda vez que vejo um RIGHT JOIN, eu o reescrevo para o LEFT antes de fazer qualquer outra coisa.