具有多对多关系的两个表的CTE递归查询

明信片乔

我有三个表,我需要一个查询才能正确返回结果。

第一个表是包含父类别和子类别的类别表。该表允许所有级别的子表,包括子类别的子表。

第二个表是可以属于类别的文件表。这与类别表有很多关系。这些文件也可以属于包含子类别的类别。

第三个表创建文件和类别之间的多对多关系。

第一个表是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
]
w

此查询应该工作。它基于@Oleg给出的答案,但有一些简化,并添加了一个level属性以确保正确的排序。

我将其设为社区Wiki,因为我不想因为别人的工作而受到赞誉...

;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

在SQL中连接具有多对多关系的两个表

来自分类Dev

连接两个在 powerpivot 中具有多对多关系的表

来自分类Dev

查询具有一对多关系的两个表

来自分类Dev

约束两个递归多对多关系

来自分类Dev

约束两个递归多对多关系

来自分类Dev

如何在具有多对多关系的两个表上对Java Mapreduce进行reduce side join?

来自分类Dev

定义具有多对多关系的两个实体之间的关系

来自分类Dev

多对多关系的两个以上的表

来自分类Dev

在两个表之间具有2个一对多关系是否可以接受?

来自分类Dev

在两个表之间具有2个一对多关系是否可以接受?

来自分类Dev

尝试从具有一对多关系的两个表中插入select

来自分类Dev

如何合并具有一对多关系的两个表

来自分类Dev

两个不同数据库中两个表之间的多对多关系

来自分类Dev

插入具有一对多关系的新实体,而不在两个表中都创建记录

来自分类Dev

插入具有一对多关系的新实体,而不在两个表中都创建记录

来自分类Dev

从具有一对多关系的两个表中获取数据的最佳方法是什么?

来自分类Dev

Django,在两个表中使用预定义值在两个表之间分配多对多关系

来自分类Dev

如何为具有多对多关系的2个MySQL表创建默认关系?

来自分类Dev

如何为具有多对多关系的2个MySQL表创建默认关系?

来自分类Dev

MariaDB - 在两个实体之间创建多对多关系表

来自分类Dev

在 SQL Server 中加入具有一对多和多对多关系的 3 个表

来自分类Dev

如何在满足计数条件的情况下查询具有多对多关系的表

来自分类Dev

MSSQL-具有多个关系的两个表

来自分类Dev

具有两个外键的表之间的关系

来自分类Dev

MSSQL-具有多个关系的两个表

来自分类Dev

具有两个表的hasManyToMany关系

来自分类Dev

在Grails中有两个具有一对多关系的实体

来自分类Dev

在两个多对多关系之间选择

来自分类Dev

实体框架-渴望加载两个多对多关系

Related 相关文章

  1. 1

    在SQL中连接具有多对多关系的两个表

  2. 2

    连接两个在 powerpivot 中具有多对多关系的表

  3. 3

    查询具有一对多关系的两个表

  4. 4

    约束两个递归多对多关系

  5. 5

    约束两个递归多对多关系

  6. 6

    如何在具有多对多关系的两个表上对Java Mapreduce进行reduce side join?

  7. 7

    定义具有多对多关系的两个实体之间的关系

  8. 8

    多对多关系的两个以上的表

  9. 9

    在两个表之间具有2个一对多关系是否可以接受?

  10. 10

    在两个表之间具有2个一对多关系是否可以接受?

  11. 11

    尝试从具有一对多关系的两个表中插入select

  12. 12

    如何合并具有一对多关系的两个表

  13. 13

    两个不同数据库中两个表之间的多对多关系

  14. 14

    插入具有一对多关系的新实体,而不在两个表中都创建记录

  15. 15

    插入具有一对多关系的新实体,而不在两个表中都创建记录

  16. 16

    从具有一对多关系的两个表中获取数据的最佳方法是什么?

  17. 17

    Django,在两个表中使用预定义值在两个表之间分配多对多关系

  18. 18

    如何为具有多对多关系的2个MySQL表创建默认关系?

  19. 19

    如何为具有多对多关系的2个MySQL表创建默认关系?

  20. 20

    MariaDB - 在两个实体之间创建多对多关系表

  21. 21

    在 SQL Server 中加入具有一对多和多对多关系的 3 个表

  22. 22

    如何在满足计数条件的情况下查询具有多对多关系的表

  23. 23

    MSSQL-具有多个关系的两个表

  24. 24

    具有两个外键的表之间的关系

  25. 25

    MSSQL-具有多个关系的两个表

  26. 26

    具有两个表的hasManyToMany关系

  27. 27

    在Grails中有两个具有一对多关系的实体

  28. 28

    在两个多对多关系之间选择

  29. 29

    实体框架-渴望加载两个多对多关系

热门标签

归档