다 대다 관계가있는 두 테이블에 대한 CTE 재귀 쿼리

엽서 Joe

결과를 제대로 반환하려면 단일 쿼리가 필요한 세 개의 테이블이 있습니다.

첫 번째 테이블은 상위 및 하위 카테고리를 포함하는 카테고리 테이블입니다. 이 테이블은 하위 범주의 하위를 포함하여 모든 수준의 하위 테이블을 허용합니다.

두 번째 테이블은 카테고리에 속할 수있는 파일 테이블입니다. 이것은 범주 테이블과 다 대다 관계를 갖습니다. 파일은 하위 범주를 포함하는 범주에 속할 수도 있습니다.

세 번째 테이블은 파일과 범주 간의 다 대다 관계를 만듭니다.

첫 번째 테이블은 Categories다음과 같습니다.

CREATE TABLE Categories (
  category_id INT NOT NULL PRIMARY KEY,
  category_name varchar(20) NOT NULL,
  parent_id INT NOT NULL
);

두 번째 테이블은 Files

CREATE TABLE Files (
  file_id INT NOT NULL PRIMARY KEY,
  file_name varchar(20) NOT NULL
);

세 번째 테이블은 파일을 범주에 연결합니다. 파일은 모든 범주에 속할 수 있으며 여러 범주에 속할 수 있습니다.

CREATE TABLE Category_File (
  category_id INT NOT NULL,
  file_id INT NOT NULL
);

테이블은 다음과 같이 채워집니다.

INSERT INTO Categories (category_id, category_name, parent_id) VALUES
(1, 'Cat1', 0),(2, 'Cat2', 0),(3, 'Cat3', 1),
(4, 'Cat4', 2),(5, 'Cat5', 1),(6, 'Cat6', 0),
(7, 'Cat7', 5),(8, 'Cat8', 4),(9, 'Cat9', 7);

INSERT INTO Files (file_id, file_name) VALUES
(1, 'File1'),(2, 'File2'),(3, 'File3'),
(4, 'File4'),(5, 'File5'),(6, 'File6');

INSERT INTO Category_File (category_id, file_id) VALUES
(3, 1),(4, 2),(5, 3),
(9, 6),(7, 2),(5, 4),
(8, 4),(6, 1),(3, 5);

이름순으로 정렬 된 카테고리와 이름순으로 정렬 된 파일을 표시하려면 리턴이 필요합니다. 따라서 모든 열이있는 모든 레코드를 쿼리하면

Result Set 1
[
category_id,    category_name,  file_id,    file_name   parent_id
1               Cat1            Null        Null        0
3               Cat3            Null        Null        1
3               Cat3            1           File1       Null
3               Cat3            5           File5       Null
5               Cat5            Null        Null        1   
5               Cat5            3           File3       Null    
5               Cat5            4           File4       Null
7               Cat7            Null        Null        5
7               Cat7            2           File2       Null
9               Cat9            Null        Null        7
9               Cat9            6           File6       Null
2               Cat2            Null        Null        0
4               Cat4            Null        Null        2
4               Cat4            2           File2       Null
8               Cat8            Null        Null        4
8               Cat8            4           File4       Null
6               Cat6            Null        Null        0
6               Cat6            1           File1       Null
]
jpw

이 쿼리는 작동합니다. @Oleg가 제공 한 답변을 기반으로 작성되었지만 몇 가지 단순화가 있으며 올바른 순서를 보장하기 위해 수준 속성을 추가합니다.

다른 사람의 작업에 대한 크레딧을 받고 싶지 않기 때문에 커뮤니티 위키로 만들었습니다 ...

;with cte as
(
    select c.category_id, c.category_name, c.parent_id, cast(category_id as varchar(max)) as lvl
    from categories c where parent_id = 0 
    union all
    select ch.category_id, ch.category_name, ch.parent_id, c.lvl + ',' + cast(ch.category_id as varchar(max)) as lvl 
    from cte c join categories ch on ch.parent_id = c.category_id
)

select category_id, category_name, file_id, file_name, parent_id 
from (
    select c.category_id, c.category_name, null as file_id, null as file_name, c.parent_id, lvl
    from cte c  
    union all       
    select c.category_id, c.category_name, f.file_id, f.file_name, null, lvl
    from cte c
    join category_file cf on cf.category_id = c.category_id
    join files f on f.file_id = cf.file_id 
) a 
order by lvl, category_name, file_name

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

일대 다 관계로 두 테이블 쿼리

분류에서Dev

가계도에 대한 재귀 CTE가 재귀하지 않음

분류에서Dev

다 대다 JOIN에 존재하는 다중 관계에 대한 SQL 쿼리

분류에서Dev

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

분류에서Dev

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

분류에서Dev

SQL Server : 두 조건부 논리에 대한 재귀 고급 쿼리 계층 관계가 표시되지 않음

분류에서Dev

동일한 WHERE 절이있는 동일한 테이블에 대한 두 개의 다른 쿼리

분류에서Dev

Datomic에 대한 재귀 데이터 로그 쿼리가 정말 느립니다.

분류에서Dev

두 개의 재귀 적 다 대다 관계 간의 제한

분류에서Dev

다른 월 및 합계 값에 대해 동일한 테이블의 두 쿼리를 결합합니다.

분류에서Dev

동일한 데이터를 가진 두 테이블에 대해 실행되는 쿼리의 다른 성능

분류에서Dev

두 테이블에 대한 mySQL 쿼리로 이에 접근하는 방법을 잘 모르겠습니다.

분류에서Dev

다른 외래 키가 참조하는 두 번 조인 된 테이블에 대한 카운트 쿼리

분류에서Dev

레코드에 대한 다형성 테이블 및 관련 테이블 쿼리

분류에서Dev

다른 테이블의 두 열에 대한 장고 관계

분류에서Dev

일대 다 관계가있는 두 테이블에서 선택에 삽입하려고합니다.

분류에서Dev

두 테이블에 대한 MySql 쿼리

분류에서Dev

두 테이블에 대한 SQLite 쿼리

분류에서Dev

거대한 테이블에 대한 SQL 계산 및 다중 하위 쿼리

분류에서Dev

다음 테이블 CTE에서 각 값에 대한 다음 값 가져 오기

분류에서Dev

다 대다 관계가있는 여러 테이블에서 SELECT

분류에서Dev

동일한 테이블 쿼리에서 일대 다 관계 최적화

분류에서Dev

재귀 적 CTE 쿼리는 제품 또는 페이지 계층을 생성합니다.

분류에서Dev

1 대 다 관계에서 쿼리를 작성하여 SQL 쿼리의 두 번째 테이블에서 임의의 1 레코드를 얻는 방법

분류에서Dev

일대 다 관계의 왼쪽 조인에 대한 집계 함수가있는 SQL 쿼리

분류에서Dev

동적 SQL : 관계가있는 테이블에 대한 삽입 쿼리 생성

분류에서Dev

두 개의 다른 테이블에서 두 개의 다른 열에 대한 쿼리 업데이트 -MySQL

분류에서Dev

에 대한 MySQL 쿼리가 다른 테이블에 없습니다.

분류에서Dev

재귀 쿼리 "CTE"의 "ProductNames"열에있는 앵커와 재귀 부분간에 유형이 일치하지 않습니다.

Related 관련 기사

  1. 1

    일대 다 관계로 두 테이블 쿼리

  2. 2

    가계도에 대한 재귀 CTE가 재귀하지 않음

  3. 3

    다 대다 JOIN에 존재하는 다중 관계에 대한 SQL 쿼리

  4. 4

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

  5. 5

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

  6. 6

    SQL Server : 두 조건부 논리에 대한 재귀 고급 쿼리 계층 관계가 표시되지 않음

  7. 7

    동일한 WHERE 절이있는 동일한 테이블에 대한 두 개의 다른 쿼리

  8. 8

    Datomic에 대한 재귀 데이터 로그 쿼리가 정말 느립니다.

  9. 9

    두 개의 재귀 적 다 대다 관계 간의 제한

  10. 10

    다른 월 및 합계 값에 대해 동일한 테이블의 두 쿼리를 결합합니다.

  11. 11

    동일한 데이터를 가진 두 테이블에 대해 실행되는 쿼리의 다른 성능

  12. 12

    두 테이블에 대한 mySQL 쿼리로 이에 접근하는 방법을 잘 모르겠습니다.

  13. 13

    다른 외래 키가 참조하는 두 번 조인 된 테이블에 대한 카운트 쿼리

  14. 14

    레코드에 대한 다형성 테이블 및 관련 테이블 쿼리

  15. 15

    다른 테이블의 두 열에 대한 장고 관계

  16. 16

    일대 다 관계가있는 두 테이블에서 선택에 삽입하려고합니다.

  17. 17

    두 테이블에 대한 MySql 쿼리

  18. 18

    두 테이블에 대한 SQLite 쿼리

  19. 19

    거대한 테이블에 대한 SQL 계산 및 다중 하위 쿼리

  20. 20

    다음 테이블 CTE에서 각 값에 대한 다음 값 가져 오기

  21. 21

    다 대다 관계가있는 여러 테이블에서 SELECT

  22. 22

    동일한 테이블 쿼리에서 일대 다 관계 최적화

  23. 23

    재귀 적 CTE 쿼리는 제품 또는 페이지 계층을 생성합니다.

  24. 24

    1 대 다 관계에서 쿼리를 작성하여 SQL 쿼리의 두 번째 테이블에서 임의의 1 레코드를 얻는 방법

  25. 25

    일대 다 관계의 왼쪽 조인에 대한 집계 함수가있는 SQL 쿼리

  26. 26

    동적 SQL : 관계가있는 테이블에 대한 삽입 쿼리 생성

  27. 27

    두 개의 다른 테이블에서 두 개의 다른 열에 대한 쿼리 업데이트 -MySQL

  28. 28

    에 대한 MySQL 쿼리가 다른 테이블에 없습니다.

  29. 29

    재귀 쿼리 "CTE"의 "ProductNames"열에있는 앵커와 재귀 부분간에 유형이 일치하지 않습니다.

뜨겁다태그

보관