棘手的选择语句

2024-01-01

我有一个包含类别的表,每个类别都有一个 ID、一个名称和一个 ParentID。问题是有3个级别,父类别、子类别和子类别。

我可以用一个简单的方法提取父类别SELECT and a WHERE ParentID IS NULL条款如下:

SELECT *
FROM Category
WHERE ParentID IS NULL

然而,一个WHERE ParentID IS NOT NULL子句将返回子类别和子类别。

我正在寻找一种仅提取子类别和子类别的方法。


通常,对于此类问题,最好使用使用公用表表达式的递归查询 http://msdn.microsoft.com/en-us/library/ms186243%28v=sql.105%29.aspx。像这样:

;WITH CategoriesTree(CategoryID, CategoryName, ParentName, CategoryLevel)
AS
(
   SELECT 
     c.ID, 
     c.Name, 
     CAST('No Parent' AS VARCHAR(50)) AS ParentName, 
     0 AS CategoryLevel
   FROM @Categories c
   WHERE c.ParentID IS NULL
   UNION ALL
   SELECT c.ID, c.Name, p.CategoryName, p.CategoryLevel + 1
   FROM CategoriesTree p
   INNER JOIN @Categories c ON c.ParentID = p.CategoryID
)
SELECT * 
FROM CategoriesTree
Where CategoryLevel = some id;

SQL 小提琴演示 http://www.sqlfiddle.com/#!3/d41d8/6963

这会给你:

CATEGORYID       CATEGORYNAME         PARENTNAME      CATEGORYLEVEL
    1         Root Cateogry         No Parent               0
    2         Sub Cateogry 1        Root Cateogry           1
    3         Sub Cateogry 2        Root Cateogry           1
    4         Sub Cateogry 3        Root Cateogry           1
    8         sub Cateogry 1 of 3   Sub Cateogry 3          2
    7         Sub Cateogry 1 of 2   Sub Cateogry 2          2
    5         Sub Cateogry 1 of 1   Sub Cateogry 1          2
    6         sub Cateogry 2 of 1   Sub Cateogry 1          2

这是如何运作的?

使用此查询,您可以控制要选择的类别级别。例如,对于我在之前的演示中使用的示例数据,这里是类别树:

                        1: RootCategory                Category Level:  0
                               |
                               |
                 ---------------------------- 
                 |             |            |
                 |             |            |
              2: Sub1        3: Sub2      4: sub3      Category Level:   1
                 |             |            |
          ------------         |            |
          |          |         |            |
          |          |         |            |
     5: Sub1of1  6: Sub2of1   7: sub1of2   8: sub1of3  Category Level:   2

此查询将为您提供带有新生成的类别树CategoryLevel柱子。

注意:在我在演示中使用的示例数据中,只有一个父类别(带有parentid一片空白)。但是,如果有很多父类别,查询将正常工作。这是因为 CTE 的锚查询,即:

SELECT 
     c.ID, 
     c.Name, 
     CAST('No Parent' AS VARCHAR(50)) AS ParentName, 
     0 AS CategoryLevel
FROM @Categories c
WHERE c.ParentID IS NULL;

然后,您可以使用生成的列CategoryLevel仅选择您感兴趣的级别的子类别。

例如,如果只需要选择根类别的第一个子类别的子类别,则可以使用谓词获取这些类别CategoryLevel = 2:

;WITH CategoriesTree(CategoryID, CategoryName, ParentName, CategoryLevel)
AS
(
    ...
)
SELECT * 
FROM CategoriesTree
WHERE CategoryLevel = 2;

这会给你:

CATEGORYID       CATEGORYNAME         PARENTNAME      CATEGORYLEVEL
    8        sub Cateogry 1 of 3    Sub Cateogry 3          2
    7        Sub Cateogry 1 of 2    Sub Cateogry 2          2
    5        Sub Cateogry 1 of 1    Sub Cateogry 1          2
    6        sub Cateogry 2 of 1    Sub Cateogry 1          2

SQL 小提琴演示 http://www.sqlfiddle.com/#!3/d41d8/6965

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

棘手的选择语句 的相关文章

  • 通过 osql.exe 运行脚本时出现问题

    我尝试以这种格式运行我的软件的更新脚本 osql exe i path to script U 用户 P 密码 S sqlserver 位置 d 数据库名称 n b 大多数脚本的格式相同 并且都以 GO 结尾 其中很多都运行得很好 但随机脚
  • Sequelize.js 中的自定义或覆盖连接

    我需要使用创建自定义连接条件Sequelize js http sequelizejs com使用 MSSQL 具体来说 我需要加入TableB基于一个COALESCE中的列的值TableA and TableB并最终得到这样的连接条件 L
  • 实现软删除的最佳方法是什么?

    目前在做一个项目 我们要对大部分用户 用户角色 实现软删除 我们决定添加一个is deleted 0 数据库中每个表的字段并将其设置为 1 如果特定用户角色点击特定记录上的删除按钮 现在为了将来的维护 每个SELECT查询需要确保它们不包含
  • 快速查询最新记录的方法?

    我有一张这样的表 USER PLAN START DATE END DATE 1 A 20110101 NULL 1 B 20100101 20101231 2 A 20100101 20100505 在某种程度上 如果END DATE i
  • H2 用户定义的聚合函数 ListAgg 不能在第一个参数上使用 DISTINCT 或 TRIM()

    所以我有一个 DB2 生产数据库 我需要在其中使用可用的函数 ListAgg 我希望使用 H2 的单元测试能够正确测试此功能 不幸的是H2不直接支持ListAgg 但是 我可以创建一个用户定义的聚合函数 import java sql Co
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam
  • 弹簧隔离支持吗? SQL快照隔离

    我们正在使用 SQL Server 快照隔离可能是提高性能和解决一些死锁问题的好方法 假设我们确实需要更改为快照隔离 我似乎找不到一种简单的方法来在 Springs 上启用快照隔离 Transactional 我发现以下 hibernate
  • SQL Server 连接其他表中不存在的位置

    Service Asset AssetService Id Name Id Name AssetId ServiceId
  • 如何在 DB2 中创建返回序列值的函数?

    如何在 DB2 中创建一个从序列中获取值并返回该值的函数 应该可以在 select 或 insert 语句中使用该函数 例如 select my func from xxx insert into xxx values my func 基本
  • 删除数据库中的行后如何重新排序ID

    我正在使用 C 来制作具有 sql 数据库的程序 在数据库中我有一个名为Workers 它有一个自动增量和主键ID column 当我删除一条记录时 ID 之间会出现间隙 删除记录后如何重新排序 ID UPDATE 我要做的就是找到记录后将
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 我不断收到错误“关系 [TABLE] 不存在”

    我一直在尝试查询数据库中的两个表 在服务器资源管理器中 我可以看到两个表 甚至可以看到其中的列 我们将它们称为 Schema table1 和 Schema table2 其中 Schema 的第一个字母大写 我尝试运行以下查询 selec
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • 如何在 SQL Server 中连接

    我的数据库没有特定的列 因此我通过开关在查询中创建了一个列 我需要的是将此列与数据库中的另一列连接起来 select certificateDuration DurationType case when certificateDuratio
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我
  • 从 Sharepoint 到 SQL Server 的实时同步

    我见过许多将 SQL Server 数据同步到 SharePoint 的解决方案 但没有见过将 SharePoint 列表同步到 SQL Server 的解决方案 有谁知道解决方案吗 商业化就好了 或者 我需要编写一个 Web 部件来创建多
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 是否可以引用同一个表中的不同列?

    如果博客有一个 类别 表 如下所示 CREATE TABLE categories id INTEGER PRIMARY KEY AUTO INCREMENT parent id INTEGER NOT NULL name VARCHAR

随机推荐

  • pycharm_helpers 的拉取访问被拒绝,存储库不存在或可能需要“docker 登录”

    我正在尝试在 docker 容器内运行 pycharm 调试器 这在过去对我有用 所以我知道我的配置是正确的 但是在我的一次 docker 容器清除期间 我必须删除 pycharm 需要的容器 pycharm helpers 不幸的是 py
  • 将非 ASCII 字符替换为单个空格

    我需要用空格替换所有非 ASCII x00 x7F 字符 令我惊讶的是 这在 Python 中并不容易 除非我遗漏了一些东西 以下函数只是删除所有非 ASCII 字符 def remove non ascii 1 text return j
  • 验证生成的 JAXB 类(JSR 303 / Spring)

    我使用 JAXB maven jaxb2 plugin 从架构 请求和响应 生成域对象我想为几个属性添加验证 notnull empty 我想要自定义 Bean 验证 该应用程序是一个 REST 服务 我正在使用 Spring 3 和 JS
  • VBA Excel 形状

    我使用了一个小子程序将图片插入到我的工作表中 ActiveSheet Pictures Insert URL Select 这适用于 Excel 2003 Windows 但不再适用于 Excel 2011 Mac 因此我修改了我的子程序
  • 为每一行创建的 Pandas DataFrame

    我正在尝试将 JSON 数据从 API 传递到 Pandas DataFrame 我无法得到pandas read json处理 API 数据 所以我确信这不是最好的解决方案 但我目前有for loop运行 JSON 来提取我想要的值 这是
  • 在 AWS 上使用 Apache-Spark 加载数据

    我正在 Amazon Web Service AWS EC2 上使用 Apache Spark 来加载和处理数据 我创建了一个主节点和两个从节点 在主节点上 我有一个目录data包含所有要处理的csv格式的数据文件 现在 在我们提交驱动程序
  • Android Eclipse 问题无法创建 BuildConfig 类

    我在 Eclipse 中清理 Android 项目时收到 无法创建 BuildConfig 类 错误 我最近为移动开发人员安装了 Eclipse Juno 当我尝试导入现有的 Android 应用程序时 Eclipse 开始出现这种错误 如
  • 使用 consteval 代替 constexpr 函数有哪些优点?

    我知道需求的差异 我最感兴趣的是它带来的代码质量带来的好处 我能想到的几件事 读者只需阅读函数签名即可知道该函数是在编译时评估的 编译器可能会发出更少的代码 因为constevalfns 在运行时从不使用 这是推测 我没有这方面的真实数据
  • 数据库中什么是半连接?

    我在尝试理解半连接的概念以及它与传统连接的不同之处时遇到了麻烦 我已经尝试过一些文章 但对解释不满意 有人可以帮助我理解它吗 简单的例子 让我们使用左外连接选择成绩的学生 SELECT DISTINCT s id FROM students
  • 如何使用回调函数在 TypeScript 中保留词法范围

    我有一个 TypeScript 类 其中有一个我打算用作回调的函数 removeRow this MyClass void this is now the window object I must use this to get the c
  • Windows Python (<=3.10.2) 无法运行 `python -m venv .venv`

    此问题已解决 并向 Python org 提交了错误报告 看看我的下面自我回答 https stackoverflow com a 71041562 4516027寻求解决方法 直到在未来版本的 Python 中修复为止 我的一台电脑被这个
  • LIBGDX 创建主菜单

    所以我想为我的游戏创建一个主菜单 但我不知道下一步该做什么 我已经完成了所有的艺术工作 并且全部分层并打包在 pack 中 public class MainMenu implements Screen CrazyZombies game
  • 使用比较器的意外输出

    我有以下程序 import java util public class Test public static void main String args Integer array 3 1 4 1 5 9 Arrays sort arra
  • MYSQLi真实转义函数显示换行符和回车符

    我有一个文本区域 当我尝试通过 MYSQLi 真实转义函数和 nl2br 进行转义和清理时 简单的输出给了我奇怪的结果 我的PHP代码 the odd输出是 i love this r n r nand this is gonna be f
  • Angularfire2,startAfter() 不适用于分页

    根据 firebase 文档 这是如何做到的 var first db collection cities orderBy population limit 25 return first get then function documen
  • 改进分配器算法实现的建议

    我有一个 Visual Studio 2008 C 应用程序 其中使用标准容器的自定义分配器 以便它们的内存来自内存映射文件而不是堆 该分配器用于 4 种不同的用例 104字节固定大小结构std vector lt SomeType MyA
  • python多处理中父进程全局变量如何复制到子进程

    乌班图20 04 我对python中不同子进程访问全局变量的理解是这样的 全局变量 假设b 可用于写时复制能力的每 个子进程 如果子进程修改了该变量 则复制b首先创建该副本 然后修改该副本 此更改对父进程不可见 稍后我将就这部分提出问题 我
  • 不明确的规则定义了“T...”的类型

    以下测试之一不起作用 为什么 public class SortedInterfacesTest private static final Logger log LoggerFactory getLogger SortedInterface
  • 在AWS EC2 Linux实例上安装Chrome时出错:未找到scaling_cur_freq和scaling_max_freq

    我正在尝试在 AWS EC2 实例上安装 Chrome 与 Chromedriver selenium 一起使用 但出现了以前从未见过的错误 我能够一致地重现 但在谷歌上找不到任何关于该怎么做的信息 重现步骤 启动新的 EC2 实例 Ama
  • 棘手的选择语句

    我有一个包含类别的表 每个类别都有一个 ID 一个名称和一个 ParentID 问题是有3个级别 父类别 子类别和子类别 我可以用一个简单的方法提取父类别SELECT and a WHERE ParentID IS NULL条款如下 SEL