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 / coding / Perguntas / 78443845
Accepted
Ben H
Ben H
Asked: 2024-05-08 00:12:42 +0800 CST2024-05-08 00:12:42 +0800 CST 2024-05-08 00:12:42 +0800 CST

Ignore certos tipos de nós em DLL

  • 772

Estou no Postgres 15.1 e tenho uma nodetabela como segue:

CREATE TABLE node (
    id TEXT PRIMARY KEY,
    is_skippable BOOL,
    prev TEXT REFERENCES node(id),
    "next" TEXT REFERENCES node(id)
);

Esta tabela representa uma série de listas duplamente vinculadas, mas em certas ocasiões, para determinadas consultas, desejo remover is_skippablenós da lista e vinculá-los.

Por exemplo, se eu tivesse os seguintes dados propagados no banco de dados, onde há uma lista vinculada de A1 <-> A2 <-> A3(com A2ignorável) e uma de B1 <-> B2:

INSERT INTO node VALUES 
  ('A1', FALSE, NULL, 'A2'), 
  ('A2', TRUE, 'A1', 'A3'), 
  ('A3', FALSE, 'A2', NULL),
  ('B1', FALSE, NULL, 'B2'), 
  ('B2', FALSE, 'B1', NULL);

Para certas consultas, quero vincular is_skippableos nós. Então, se eu consultar esta tabela completa, o conjunto de resultados que estou procurando é:

eu ia anterior próximo
A1 NULO A3
A3 A1 NULO
B1 NULO B2
B2 B1 NULO

Observe que A2não está no conjunto de resultados e A2os ponteiros foram reescritos no nó antes e depois dele.

Existe uma maneira bem suportada de fazer isso no Postgres? Já vi respostas para listas vinculadas simples em outros lugares do StackOverflow (como o conceito de lista vinculada em postgresql ), mas elas não implicam na necessidade de reescrever ponteiros. Obrigado!

Exemplo de violino aqui: https://dbfiddle.uk/4lB4TAtF .

postgresql
  • 2 2 respostas
  • 30 Views

2 respostas

  • Voted
  1. Best Answer
    Zegarek
    2024-05-08T01:20:47+08:002024-05-08T01:20:47+08:00

    Você provavelmente poderia recolhê-lo para executar uma consulta lateral em ambas as direções ao mesmo tempo, mas o fato de isso apenas tentar pular para o elemento não ignorável mais próximo pode na verdade ser uma vantagem, tornando a parte recursiva mais leve. Demonstração em db<>fiddle:

    select id,(with recursive cte as( 
                select n2.id,n2.prev,n2.is_skippable
                from node n2
                where n2.id=n1.prev
                union
                select n2.id,n2.prev,n2.is_skippable
                from node n2 join cte 
                  on n2.id=cte.prev
                  and cte.is_skippable) CYCLE prev SET is_cycle USING path
              select id from cte where not is_skippable limit 1) as prev
            ,(with recursive cte as( 
                select n2.id,n2.next,n2.is_skippable
                from node n2
                where n2.id=n1.next
                union
                select n2.id,n2.next,n2.is_skippable
                from node n2 join cte 
                  on n2.id=cte.next
                  and cte.is_skippable) CYCLE next SET is_cycle USING path
              select id from cte where not is_skippable limit 1) as next
    from node n1
    where not is_skippable;
    
    eu ia anterior próximo
    A1 nulo A3
    A3 A1 nulo
    B1 nulo B2
    B2 B1 nulo
    1. Não importa se as listas se ramificam. Você pode restringir as condições de junção cte recursivas para verificar a bidirecionalidade do link e fazê-lo seguir estritamente o caminho bidirecional:

      from node n2 join cte 
             on n2.id = cte.next
            and n2.prev=cte.id --add this for strict
      

      as ramificações começam com um link unidirecional, portanto, isso irá filtrá-las.

    2. Ele não se importa com ciclos/anéis/loops, se você tiver algum, graças à detecção de ciclo integrada .

    3. Um índice de cobertura acelera as coisas:

      create index on node (id)
         include(is_skippable,prev,"next")
         with(fillfactor=100);
      
    4. Você pode estar interessado em pgrouting e Apache AGE .

    • 1
  2. Edouard
    2024-05-08T01:24:39+08:002024-05-08T01:24:39+08:00

    aqui está uma solução usando um cte recursivo :

    WITH RECURSIVE cte (id, prev, next, count) AS
    (
    SELECT n.id, n.prev, n.next, 0
      FROM node AS n
     WHERE NOT is_skippable
    UNION ALL
    SELECT c.id, COALESCE (n_prev.prev, c.prev), COALESCE(n_next.next, c.next), c.count + 1 
      FROM cte AS c
      LEFT JOIN node AS n_prev
        ON n_prev.id = c.prev
      LEFT JOIN node AS n_next
        ON n_next.id = c.next
     WHERE (c.prev IS NOT NULL AND n_prev.is_skippable)
        OR (c.next IS NOT NULL AND n_next.is_skippable)
    )
    SELECT DISTINCT ON (id) id, prev, next
      FROM cte
     ORDER BY id, count DESC ;
    

    demonstração em dbfiddle

    • 0

relate perguntas

  • Como usar jackc/pgx com pool de conexão, contexto, instruções preparadas etc.

  • Escreva uma consulta psql para localizar usuários em um intervalo de tempo

  • O caractere de escape de barra invertida do Postgresql não funciona para vírgulas em COPY FROM

  • biblioteca postgresql não encontrada no contêiner docker baseado em clojure

  • A inserção do Postgres está acontecendo apesar de violar a restrição de índice parcial

Sidebar

Stats

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

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

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