AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 333091
Accepted
user45867
user45867
Asked: 2023-11-14 23:28:53 +0800 CST2023-11-14 23:28:53 +0800 CST 2023-11-14 23:28:53 +0800 CST

Padrão SQL para obter "raiz/início" do conjunto de dados de hierarquia desigual

  • 772

Eu sinto que este é um problema comum e já vi isso em alguns desafios de SQL, mas pela minha vida, não consigo pensar claramente em uma solução.

Digamos que você tenha uma hierarquia desigual. Elementos que pertencem a outros elementos mas você não conhece o topo.

Digamos que seja um organograma da empresa para mantê-lo simples (na verdade, são dependências de tarefas, mas eh).

Então há uma mesa. Nome do funcionário e nome do chefe.

Employee name: Bob .... Boss Name: Dora
Employee name Dora .... Boss Name: Kim

E assim por diante. No meu caso, há uma informação adicional. Uma pessoa só se reporta a uma pessoa. Relacionamento um para um.

Existem N elementos no topo da cadeia que possuem Nome: Quem quer que seja Chefe: Nulo.

Então eu estava fazendo algo da seguinte forma:

select employee_name, boss_name
from boss_table b1
left join boss_table b2 on b1.boss_name = b2.employee_name
left join boss_table b3 on b2.boss_name = b3.employee_name

E assim por diante para tentar encontrar o 'Chefe Raiz' ou 'Chefe Superior' de cada funcionário. No entanto, alguns desses elementos aninhados são MUITO profundos - não quero fazer 20 junções ... ou pelo menos digitá-los - sinto que uma função recursiva é a resposta óbvia, mas não consigo descobrir - pensamentos?

join
  • 1 1 respostas
  • 29 Views

1 respostas

  • Voted
  1. Best Answer
    J.D.
    2023-11-15T01:12:19+08:002023-11-15T01:12:19+08:00

    O que você está procurando é chamado de CTE recursivo . Esta é uma das construções mais comuns para implementar recursão em um sistema de banco de dados. Um CTE recursivo é um conjunto de resultados nomeado temporário que se auto-refere para produzir os resultados, semelhante ao funcionamento de uma função recursiva tradicional.

    CTEs recursivos e dados hierárquicos

    CTEs recursivos permitem processar dados hierárquicos, como uma explosão de peças (componente, subcomponentes) ou uma hierarquia de gerenciamento (gerente, funcionários).

    Exemplo de organograma dos documentos acima:

    WITH RECURSIVE managers
      (indent, employee_ID, manager_ID, employee_title)
     AS
       (
    
         SELECT '' AS indent, employee_ID, manager_ID, title AS employee_title
           FROM employees
           WHERE title = 'President'
    
        UNION ALL
    
       SELECT indent || '--- ',
           employees.employee_ID, employees.manager_ID, employees.title
         FROM employees JOIN managers
           ON employees.manager_ID = managers.employee_ID
     )
    
    SELECT indent || employee_title AS Title, employee_ID, manager_ID
      FROM managers
    ;
    

    Aqui estão alguns outros exemplos de implementação de CTEs recursivos no Snowflake.

    • 0

relate perguntas

  • SQL Server: junte duas tabelas com datas "válidas até"

  • SQL Return Count of Answers with 0's for Choices from other table

  • Posso automatizar a instrução "on" das consultas MySQL?

  • Qual é a diferença entre um INNER JOIN e um OUTER JOIN?

  • Como é a saída de uma instrução JOIN?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve