我有一个自引用表,我很难找到没有任何其他行指向它的行 – 或者换句话说,将那些不是父项的行提供给任何其他行,这意味着,当然,他们没有孩子.
这是我的样本数据表:
+----+------+--------+
| id | name | cat_id |
+----+------+--------+
| 1 | C1 | |
| 2 | C2 | |
| 3 | C3 | 1 |
| 4 | C4 | 2 |
| 5 | C5 | 2 |
| 6 | C6 | 5 |
+----+------+--------+
这里,cat_id是父.这是一个’代表’:
.
├──C1
| └──C3
└──C2
├──C4
└──C5
└──C6
如图所示,类别可以无限期地具有子类别,并且通过指向cat_id来定义它们.如果它是一个“主要”类别,它只是没有指向任何东西.我可以通过在cat_id中选择NULL来获取所有没有“父”的类别,但是如何选择没有“子”的类别?
我试过了:
SELECT
c1.id, c1.name, c1.cat_id
FROM
cat c1
INNER JOIN
cat c2
ON
c1.id != c2.cat_id
但这不仅返回重复的行,还包括具有子节点的类别.预期结果在表示中以粗体显示.您可以在this SQLFiddle中运行测试.
我怎么能做到这一点?没有递归是否可以实现?
解决方法:
这可能是您在初始查询中的目标:
select a.*
from cat a left outer join
cat b on a.id = b.cat_id
where b.cat_id is null