Declaração ANSI 92 recursiva SQL necessário
-
10-07-2019 - |
Pergunta
Eu estou traduzindo Demonstrações SQL Server SQL no seu equivalente genérico ANSI no presente, e estou preso com uma declaração recursiva usando uma instrução WITH.
Por uma questão de se concentrar sobre o assunto, eu vou simplificar a questão da seguinte maneira
Se eu tiver duas tabelas
-
ReportingUnit
- col1: Chave
- col2: ParentReportingUnitKey
-
Facility
- col1: Chave
- col2: ParentReportingUnitKey
Esta estrutura está a descrever uma hierarquia de unidades de relatórios para baixo para uma instalação, em que uma unidade de referência pode ter 0 .. 1 unidades de informação mãe, directas e 0 .. n criança unidades de relatórios.
A instalação é um registro 'folha', que links para uma unidade de relatório.
Eu preciso criar uma instrução SQL válida ANSI 92 (ou na pior das hipóteses um que irá funcionar em Oracle, DB2 e SQL Server) que irá retornar todas as instalações relacionadas com uma unidade em qualquer lugar relatando desistido da hierarquia.
por exemplo.
- ReportingUnit R1 tem filhos ReportingUnit R1.1 e R1.2
- ReportingUnit R1.1 tem filhos R1.1.1, R1.1.2
-
ReportingUnit R1.2 tem filhos R1.2.1, R1.2.2
-
Facility F1 tem uma unidade de relatório pai R1.1.1
- Facility F2 tem uma unidade de relatório pai R1.1.2
- Facility F3 tem uma unidade de relatório pai R1.2.1
- Facility F4 tem uma unidade de relatório pai R1.2.2
Tendo em mente existem pode ser 0 .. n níveis de recursividade na tabela de ReportingUnit, como posso devolver todos os 4 instalações de uma instrução SQL dado o parâmetro ReportingUnit = R1?
Solução
Eu estou razoavelmente certo que nenhuma declaração recursiva estavam disponíveis no SQL-92; a versão mais antiga, onde que foi apoiado era SQL-99.
Por isso, você está preso com não usando SQL-92. Por que você acha SQL-92 é desejável? há-lo como um nível básico de funcionalidade SQL, ou é algum outro motivo?
As versões atuais do DB2 têm a cláusula WITH e pode conseguir consultas recursivas. Eu acredito que a Oracle tem a cláusula WITH também; Eu não tenho certeza se ele pode conseguir consultas recursivas usá-los. A Oracle também tem o CONNECT totalmente fora do padrão e não-relacionais PRÉVIO. Eu não tenho certeza do que suportes MS SQL Server.
Há um razoavelmente forte chance de que você não será capaz de encontrar uma única sintaxe que é suportado por todos os três de seus DBMS especificados.
Outras dicas
Não há uma solução SQL-92 para consultas recursivas.
A melhor opção é usar uma das soluções para codificação de relações hierárquicas de modo que você pode consultar todos os descendentes ou ascendentes, usando SQL padrão.
Veja uma descrição breve aqui: " o que é a maneira mais eficiente / elegante para analisar uma mesa plana em uma árvore? ".
Ou leia " árvores e hierarquias no SQL para Smarties " por Joe Celko.