有一个数据表TableA如下表, 数据是模拟的。其中Id是主键,Parent是一个外键,外键的值指向其自身.
Id |
Name |
Degree |
Parent(TableA:Id) |
1 |
NameA |
2 |
5 |
2 |
NameB |
3 |
1 |
3 |
NameC |
3 |
1 |
4 |
NameD |
4 |
2 |
5 |
NameE |
1 |
|
6 |
NameF |
5 |
4 |
查询语句的结果须是Degree值大于2的记录,如对与上表中的数据,符合Degree值大于2的记录如下所示:
Id |
Name |
Degree |
Parent(TableA:Id) |
2 |
NameB |
3 |
1 |
3 |
NameC |
3 |
1 |
4 |
NameD |
4 |
2 |
6 |
NameF |
5 |
4 |
然后须查找Parent值指向的记录不存在的记录,对于上表,查询结果如下:
Id |
Name |
Degree |
Parent(TableA:Id) |
2 |
NameB |
3 |
1 |
3 |
NameC |
3 |
1 |
请问Sql语句怎么些呢?谢谢.
PS:请在写SQL语句的时候注意运行效率
SELECT * FROM TableA WHERE Degree > 2 AND Parent NOT IN (SELECT Id FROM TableA WHERE Degree > 2)
要递归那就写公用表表达式。http://www.cnblogs.com/kissdodog/p/3153012.html
一直在想有没有"临时存储结果集"的东东,因为我怀疑SELECT * FROM TableA WHERE Degree > 2 AND Parent NOT IN (SELECT Id FROM TableA WHERE Degree > 2)语句中红色背景代码,每查询一条记录执行一次,会影响效率,谢谢
客户端递归,数据库中无法确定你的树深度是多少~
需要递归吗?我是想获得符合条件的最上层的节点,所以对于符合条件的节点,就查询它的父节点是否存在,如果父节点不存在就显示这些数据.
@sikla: 不考虑父节点的父节点???
@幻天芒: 要考虑啊,子节点、父节点、父节点的父节点都在一个表中,遍历到子节点的时候,是判断子节点的父节点是否存在.遍历到父节点的时候,是判断父节点的父节点是否存在,如果存在,就显示父节点的父节点,如果不存在,就显示父节点.我写了一个语句,但是查询耗时太长,请教大侠帮助写一条查询语句.
@sikla: 我的建议是读取到客户端,用C#代码实现。对于树形结构,层次不确定的情况下,sql语句不太好写。
SELECT * FROM (SELECT * FROM TableA A WHERE A.DEGREE>2) AS T1 WHERE T1.PARENT NOT IN(SELECT ID FROM TABLEA B WHERE B.DEGREE>2)
SELECT * FROM TableA WHERE Degree > 2 AND Id NOT IN (SELECT Parent FROM TableA WHERE Degree > 2)
试试这句哦