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

  1. ReportingUnit

    • col1: Chave
    • col2: ParentReportingUnitKey
  2. 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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top