sql-server在父子层次结构中检测父项

时间:2018-12-28 13:36:52

标签: sql sql-server

我正在项目中实现回收站功能。如果整个文件夹被删除,我只希望看到文件夹名称,而不能看到其所有子文件夹(内容)。这是它的外观:

+----+----------+---------------+ | ID | ParentID | Name | +----+----------+---------------+ | 3 | 1 | Css | +----+----------+---------------+ | 4 | 8 | New File.txt | +----+----------+---------------+ | 6 | 10 | Scripts.js | +----+----------+---------------+ | 7 | 3 | Styles.css | +----+----------+---------------+ | 8 | 3 | Bootstrap.css | +----+----------+---------------+

我唯一想要的输出是第3行和第6行。

如您所见,“父子”关系中没有逻辑模式,因此,我很难弄清楚如何不显示子行。

另一种选择是标记行,然后稍后我可以对输出进行排序。例如,像这样:

+----+----------+---------------+--------+ | ID | ParentID | Name | Label | +----+----------+---------------+--------+ | 3 | 1 | Css | parent | +----+----------+---------------+--------+ | 4 | 8 | New File.txt | child | +----+----------+---------------+--------+ | 6 | 10 | Scripts.js | parent | +----+----------+---------------+--------+ | 7 | 3 | Styles.css | child | +----+----------+---------------+--------+ | 8 | 3 | Bootstrap.css | child | +----+----------+---------------+--------+

1 个答案:

答案 0 :(得分:5)

您要做的是在回收站中选择没有父项的任何内容。

Select child.ID,child.ParentID,child.Name from [table] child 
left join [table] parent
on child.parentID = parent.ID
where parent.ID is null

这将得到父母不在表中的任何东西