如何在SQL中实现“hasChildren”SELECT语句?

时间:2009-11-26 21:14:32

标签: sql select

假设我有下表:

ID | parentID | MoreStuff
1  | -1       |  ...
2  |  1       |  ...
3  |  1       |  ...
4  |  2       |  ...
5  |  1       |  ...

如何生成SQL SELECT语句以查明特定行是否包含子项?换句话说,我想知道ID 1是否有孩子,在这种情况下它有3个孩子。

我不确定如何创建SQL语句:

SELECT ID, hasChildren FROM myTable;

在上面的SQL SELECT语句中,hasChildren会替换什么?

5 个答案:

答案 0 :(得分:16)

没有群组版本:

SELECT MyTable.Id, CASE WHEN EXISTS 
    (SELECT TOP 1 1  --you can actually select anything you want here
     FROM MyTable MyTableCheck 
     WHERE MyTableCheck.ParentId = MyTable.Id
    ) THEN 1 ELSE 0 END AS HasRows
FROM MyTable

答案 1 :(得分:12)

加入桌子以查找是否有孩子:

SELECT 
    parent.id as ID
,   case when count(child.id) > 0 then 1 else 0 end as hasChildren 
FROM       myTable parent
LEFT JOIN  myTable child
ON         child.parentID = parent.ID
GROUP BY   parent.id

答案 2 :(得分:2)

如果您知道已经知道父ID,那么查询很简单 - 只需选择具有该父ID的行数。

SELECT count(*) FROM myTable where parentID = 1;

答案 3 :(得分:2)

您的问题有非常有效的答案可行。但是,如果您的数据集非常大,我会考虑这种查询的性能。

如果要使用Group By或Sub Query来获取数据,请确保ID列和Parent列都有单独的索引。

为了获得更好的性能,您应该添加一个名为“haschildren”的列,它可以是“位”数据类型。当项目被插入或删除时,应该从您的应用程序代码更新此列。这将允许您运行更快的查询:

SELECT * FROM table WHERE haschildren IS NOT NULL

答案 4 :(得分:1)

上面的解决方案很好,但你不应该像'haschildren'那样添加列,除非你确实遇到了性能问题(参见GateKiller的帖子)。这样的列使数据库非规范化,即同一条信息将存储在2个位置,这使得您的数据更有可能变得不一致。每当您插入新子项,删除现有子项或更新子项的父项时,您都必须维护此列。