简体   繁体   中英

SQL hierarchical query performance issue

I have the following table 1 which depicts the relationships between each parent node and its immediate child nodes. For example, A->C, B->D, C->E etc.

TABLE 1 :

NAME TYPE NODE_NAME NODE_TYPE
A X1 C X2
B X1 D X0
C X2 E X0
D X0 NULL NULL
E X0 NULL NULL

TABLE 2 :

NAME TYPE NODE_NAME NODE_TYPE
A X1 C X2
A X1 E X0
B X1 D X0
C X2 E X0

I would like to transform table 1 -> table 2 as shown above.

Basically, it list all the child nodes of parent A (for example : A->C, A->E)

How can I optimize my code? It takes forever to run on 7600+ rows due to cycles i believe

Context : Mysql doesn't support NOCYCLE, what are my options?

SELECT 
      NAME,
      TYPE,
      CONNECT_BY_ROOT NODE_NAME,
      CONNECT_BY_ROOT NODE_TYPE
  FROM TABLE_1
    CONNECT BY
      NODE_NAME = PRIOR NAME
      AND NODE_TYPE = PRIOR TYPE
      AND PRIOR NODE_NAME <> NAME
      AND PRIOR NODE_TYPE <> TYPE
    ORDER BY NODE_TYPE)
  ;

You can use:

WITH RECURSIVE rcte (name, type, node_name, node_type) AS (
  SELECT *
  FROM   TABLE1
  WHERE  node_name IS NOT NULL
  AND    node_type IS NOT NULL
UNION ALL
  SELECT r.name, r.type, t.node_name, t.node_type
  FROM   rcte AS r
         INNER JOIN TABLE1 t
         ON (r.node_name = t.name AND r.node_type = t.type)
  WHERE  t.node_name IS NOT NULL
  AND    t.node_type IS NOT NULL
)
SELECT *
FROM   rcte;

Which, for the sample data:

CREATE TABLE TABLE1(
  NAME      VARCHAR(1),
  TYPE      VARCHAR(2),
  NODE_NAME VARCHAR(1) REFERENCES TABLE1(name),
  NODE_TYPE VARCHAR(2) REFERENCES TABLE1(type)
);

INSERT INTO TABLE1 (name, type, node_name, node_type)
SELECT 'A', 'X1', 'C',  'X2' UNION ALL
SELECT 'B', 'X1', 'D',  'X0' UNION ALL
SELECT 'C', 'X2', 'E',  'X0' UNION ALL
SELECT 'D', 'X0', NULL, NULL UNION ALL
SELECT 'E', 'X0', NULL, NULL;

Outputs:

name type node_name node_type
A X1 C X2
B X1 D X0
C X2 E X0
A X1 E X0

db<>fiddle here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM