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.