Gostaria de fazer uma união de duas tabelas que na verdade estão em uma constelação hierárquica.
Como eu escreveria isso em álgebra relacional? Digamos que a tabela A seja a mãe de B em um relacionamento 1:n.
Primeiro faço uma seleção em A e depois quero fazer uma união apenas com essas entradas em B que estariam em um join com a seleção em A.
Eu gostaria de escrevê-lo da maneira que um banco de dados o avaliaria.
Existe tal coisa como uma união condicional?
Se entendi bem a pergunta, sua tarefa pode ser resolvida usando consultas recursivas. Oracle (consulte e SQLServer (2005 e superior) suportam isso. Certamente, diferentes fornecedores de RDMS usam uma sintaxe ligeiramente diferente.
Você quer dizer interseção? Considere relvars
Customers
eOrders
com uma correspondência onde um cliente tem zero, um ou muitos pedidos (eu não me referiria a isso como uma hierarquia, no entanto). Para encontrar clientes que têm pedidos:Eu suspeito que não é isso que você quer dizer, no qual, por favor, corrija sua pergunta para adicionar dados de exemplo e resultados esperados.
Não tenho certeza do que você quer dizer com UNIÃO. Por favor explique!
Se você está se referindo ao operador UNION que combina conjuntos de linhas "verticalmente", isso pode funcionar para você:
Isso fará uma única operação de varredura em ambas as tabelas, em vez de pelo menos duas varreduras na tabela A para a seguinte consulta:
Agora é possível quando você disse UNION que você simplesmente quis dizer uma interseção matemática, caso em que o último SELECT acima será o que você precisa - uma simples operação JOIN:
ATUALIZAR
Aparentemente, alguns mecanismos de banco de dados têm recursos diferentes. Por exemplo, as duas últimas consultas no meu script de exemplo abaixo (supostamente) têm planos de execução muito diferentes no MySQL, mas são idênticas no SQL Server, que seleciona o melhor caminho de acesso alterando a ordem de junção, a posição de entrada esquerda/direita e movendo condições ao redor, conforme necessário. Não está preso fazendo JOINs primeiro e WHEREs depois.
Para apoiar minha afirmação sobre o servidor SQL, preparei alguns scripts de teste. Isso carrega uma tabela pai com 1 milhão de linhas e uma tabela filha com aproximadamente 2,5 milhões de linhas. As linhas individuais que estamos procurando são colocadas bem fundo na pilha (totalmente desnecessário, eu sei, mas ei, foi divertido).
Os dois planos de execução são idênticos. Suprimi o paralelismo porque era apenas ruído desnecessário (os planos ainda eram os mesmos). Aqui está o resultado do SHOWPLAN com a consulta removida (única parte que estava diferente).