假设我有下表:
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会替换什么?
答案 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个位置,这使得您的数据更有可能变得不一致。每当您插入新子项,删除现有子项或更新子项的父项时,您都必须维护此列。