我有一张自引用表,我在寻找没有其他行指向它的行方面遇到了麻烦 - 或者说,换句话说,获取那些不是其他任何行的父级的行,当然,这意味着它们没有子节点。
这是我的带有示例数据的表:
+----+------+--------+
| 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中运行测试。
我该如何实现这一点?是否可以在不使用递归的情况下实现?