동적 테이블 이름을 사용하는 MySQL 8.0의 재귀 쿼리

chx

두 개의 테이블이 있습니다. 하나는 sections, 여기에는 id, a parent_table및 a parent_id가 있고 다른 pages하나에는 idstatus(및 기타) 열이 있습니다. 섹션의 상위는 parent_table에 따라 다른 섹션 또는 페이지가 될 수 있습니다 . 주어진 섹션이 status = 1페이지 에 있는지 여부를 창 기능을 사용하여 어떻게 알 수 있습니까? (MySQL 8.0 (또는 MariaDB 10.2)을 사용하지만 절실하게 필요한 경우 postgresql로 변환 할 수 있습니다).

예제 데이터 :

섹션

id|parent_table|parent_id
1 |pages       |1
2 |sections    |1
3 |pages       |2
4 |sections    |2

페이지

id|status
 1|1
 2|0

샘플 데이터를 다시 생성하려면 :

create table pages (id int not null primary key, status int not null) collate utf8mb4_general_ci;
create table sections (id int not null primary key, parent_table varchar(20), parent_id int not null) collate utf8mb4_general_ci;
insert into pages values (1,1),(2,0);
insert into sections values (1,'pages',1),(2,'sections',1),(3,'pages',2),(4,'sections',2);
폴 스피겔

모든 섹션에 해당하는 페이지 상태를 가져 오려면 다음 재귀 쿼리를 사용할 수 있습니다.

with recursive r as (
  select s.id as section_id, s.parent_id, s.parent_table
  from sections s
  union all
  select r.section_id, s.parent_id, s.parent_table
  from r
  join sections s on s.id = r.parent_id and r.parent_table = 'sections'
)
select r.section_id, p.id as page_id, p.status
from r
join pages p on p.id = r.parent_id
where r.parent_table = 'pages';

결과:

| section_id | page_id | status |
| ---------- | ------- | ------ |
| 1          | 1       | 1      |
| 2          | 1       | 1      |
| 4          | 1       | 1      |
| 3          | 2       | 0      |

DB Fiddle에서보기

재귀는 모든 섹션에서 루트 섹션으로 트리를 순회합니다. 이렇게하면 내부 쿼리의 단일 섹션으로 결과를 제한 할 수 있습니다. 예 : 섹션 3의 상태 만 알고 싶다면 RCTE의 첫 번째 UNION 부분에 WHERE 절을 사용합니다.

with recursive r as (
  select s.id as section_id, s.parent_id, s.parent_table
  from sections s
  where s.id = 3 -- limit to a single section
  union all
  select r.section_id, s.parent_id, s.parent_table
  from r
  join sections s on s.id = r.parent_id and r.parent_table = 'sections'
)
select r.section_id, p.id as page_id, p.status
from r
join pages p on p.id = r.parent_id
where r.parent_table = 'pages';

결과:

| section_id | page_id | status |
| ---------- | ------- | ------ |
| 3          | 2       | 0      |

DB Fiddle에서보기

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

MySql-하나의 쿼리에서 동적 테이블 이름 사용

분류에서Dev

Union을 사용하는 SQL 쿼리의 동적 테이블

분류에서Dev

동일한 테이블의 재귀 쿼리

분류에서Dev

동적 변수를 사용하여 MySQL 테이블 쿼리

분류에서Dev

MySQL을 사용하여 데이터베이스의 모든 테이블 이름을 찾는 SQL 쿼리

분류에서Dev

refcursor를 사용하는 동적 쿼리의 출력을 테이블에 저장

분류에서Dev

2 개 테이블의 현재 MySQL 쿼리 최적화

분류에서Dev

동일한 테이블의 값이있는 MYSQL 쿼리

분류에서Dev

Count 및 2 테이블을 사용하는 MYSQL 쿼리 최적화 질문

분류에서Dev

동일한 테이블의 MySQL 카운트 하위 쿼리

분류에서Dev

하위 쿼리를 사용한 재귀 관계 및 상대 테이블 쿼리

분류에서Dev

Postgres의 2 개 테이블에 합계가있는 재귀 쿼리

분류에서Dev

열 이름을 다른 테이블의 행과 일치시키는 MYSQL 쿼리

분류에서Dev

동적 쿼리 : SQL-Server에서 테이블 이름 또는 기타 문자열을 정의하는 방법

분류에서Dev

JDBC를 사용하여 SELECT 쿼리에서 동적 테이블 이름을 사용하는 방법

분류에서Dev

동적 열 이름을 사용하는 C #의 mysql select 명령

분류에서Dev

동일한 테이블에 대한 쿼리 내의 MySQL 쿼리

분류에서Dev

쿼리를 사용하여 mysql의 테이블에 삽입

분류에서Dev

테이블을 재사용하는 3 개의 테이블에 대한 SQL 쿼리

분류에서Dev

동일한 열 이름을 가진 SQL 쿼리 두 테이블을 하나의 테이블로

분류에서Dev

mysql 쿼리는 하나의 테이블에서 테이블을 결합

분류에서Dev

동일한 테이블을 조인하는 MySQL 쿼리

분류에서Dev

부모-자식 테이블의 모든 조상을 쿼리하는 재귀 CTE가 느립니다.

분류에서Dev

재귀 SQL 쿼리이지만 일반적인 종류의 재귀는 아닙니다.

분류에서Dev

Postgres 쿼리의 동적 테이블 이름

분류에서Dev

Propel 쿼리의 동적 테이블 이름

분류에서Dev

동적 쿼리를 통해 테이블의 두 열을 비교하는 방법

분류에서Dev

두 테이블 Mysql을 결합하는 쿼리의 계산

분류에서Dev

쿼리에서 3 개의 테이블을 결합하는 MySQL

Related 관련 기사

  1. 1

    MySql-하나의 쿼리에서 동적 테이블 이름 사용

  2. 2

    Union을 사용하는 SQL 쿼리의 동적 테이블

  3. 3

    동일한 테이블의 재귀 쿼리

  4. 4

    동적 변수를 사용하여 MySQL 테이블 쿼리

  5. 5

    MySQL을 사용하여 데이터베이스의 모든 테이블 이름을 찾는 SQL 쿼리

  6. 6

    refcursor를 사용하는 동적 쿼리의 출력을 테이블에 저장

  7. 7

    2 개 테이블의 현재 MySQL 쿼리 최적화

  8. 8

    동일한 테이블의 값이있는 MYSQL 쿼리

  9. 9

    Count 및 2 테이블을 사용하는 MYSQL 쿼리 최적화 질문

  10. 10

    동일한 테이블의 MySQL 카운트 하위 쿼리

  11. 11

    하위 쿼리를 사용한 재귀 관계 및 상대 테이블 쿼리

  12. 12

    Postgres의 2 개 테이블에 합계가있는 재귀 쿼리

  13. 13

    열 이름을 다른 테이블의 행과 일치시키는 MYSQL 쿼리

  14. 14

    동적 쿼리 : SQL-Server에서 테이블 이름 또는 기타 문자열을 정의하는 방법

  15. 15

    JDBC를 사용하여 SELECT 쿼리에서 동적 테이블 이름을 사용하는 방법

  16. 16

    동적 열 이름을 사용하는 C #의 mysql select 명령

  17. 17

    동일한 테이블에 대한 쿼리 내의 MySQL 쿼리

  18. 18

    쿼리를 사용하여 mysql의 테이블에 삽입

  19. 19

    테이블을 재사용하는 3 개의 테이블에 대한 SQL 쿼리

  20. 20

    동일한 열 이름을 가진 SQL 쿼리 두 테이블을 하나의 테이블로

  21. 21

    mysql 쿼리는 하나의 테이블에서 테이블을 결합

  22. 22

    동일한 테이블을 조인하는 MySQL 쿼리

  23. 23

    부모-자식 테이블의 모든 조상을 쿼리하는 재귀 CTE가 느립니다.

  24. 24

    재귀 SQL 쿼리이지만 일반적인 종류의 재귀는 아닙니다.

  25. 25

    Postgres 쿼리의 동적 테이블 이름

  26. 26

    Propel 쿼리의 동적 테이블 이름

  27. 27

    동적 쿼리를 통해 테이블의 두 열을 비교하는 방법

  28. 28

    두 테이블 Mysql을 결합하는 쿼리의 계산

  29. 29

    쿼리에서 3 개의 테이블을 결합하는 MySQL

뜨겁다태그

보관