表
ID PID NAME
1 0 A
2 0 B
3 1 A1
4 1 A2
5 2 B1
6 2 B2
结果呈现的要求是,将不同父节点的子节点数据排列组合。
希望得到的结果
NAME1 NAME2
A1 B1
A1 B2
A2 B1
A2 B2
求大神帮忙 谢谢!!!
我题目可能没有写清楚
结果呈现的要求是 将不同父节点的子节点数据排列组合。
规则没说清楚,从提供的数据猜测的话,
1、不明白为啥表1有A/B,结果没有。
2、不明白为啥A1排前,B1排后。
3、不明白为啥没有B1/B2, B1/A2, B1/A2, B2/A1,B2/A2,B2/B1,电脑知道A和B是不同的吗?还是只有题主知道?
4、按照你提供的原始数据,我猜测的规则结果应该有n*(n-1)=30行,排除掉前后顺序调转的不算的话,也应该有(n-1)!=15行。
5、我猜测的规则你看懂了吗,和你希望的规则一样吗?
谢谢
我题目可能没有写清楚
结果呈现的要求是 将不同父节点的子节点数据排列组合。
@xuliyuan173: 那就很容易了,你GOOGLE一下CTE Oracle。
CTE是SQL SERVER的,Oracle的叫啥我就不清楚了。
楼下的解决方案适用于两级树,用递归可以适用于N级树。
@爱编程的大叔:
好的 谢谢大叔!!!
@xuliyuan173: 我好像也看错了,你这是不同父节点Cross join啊
那就应该这样写
Select name from T1 where T1.PID in (Select ID from T1 where PID=0)
CROSS JOIN
Select name from T1 where T1.PID in (Select ID from T1 where PID=0)
类似这样,有语法错误,你改改。
@爱编程的大叔: 我开始也是这样的想法,但是应为父节点的数量不固定,所以这条语句会Join很多表。
@xuliyuan173: 这时候我会建议你用程序代码解决的。
一般这种树存储的数据不会太多,无需担心性能问题。
所以任何一个方法可以解决就行,不要纠结于一句SQL解决。
@爱编程的大叔: 恩 好的 谢谢 :)
select dbms_random.value(0,100) from dual
大侠,您这出的是随机数啊
select t1.name ,t2.name from table t1 left join table t2 on t1.pid <> t2.pid where t1.pid <> 0