首页 新闻 会员 周边 捐助

关于 ORACLE随机组合

0
[已解决问题] 解决于 2016-07-27 17:07


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

求大神帮忙 谢谢!!!

问题补充:

我题目可能没有写清楚

结果呈现的要求是  将不同父节点的子节点数据排列组合。

xuliyuan173的主页 xuliyuan173 | 菜鸟二级 | 园豆:249
提问于:2016-03-04 09:51
< >
分享
最佳答案
0

规则没说清楚,从提供的数据猜测的话,

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、我猜测的规则你看懂了吗,和你希望的规则一样吗?

 

奖励园豆:5
爱编程的大叔 | 高人七级 |园豆:30844 | 2016-03-04 10:26

谢谢

我题目可能没有写清楚

结果呈现的要求是  将不同父节点的子节点数据排列组合。

 

xuliyuan173 | 园豆:249 (菜鸟二级) | 2016-03-04 10:37

@xuliyuan173: 那就很容易了,你GOOGLE一下CTE Oracle。

CTE是SQL SERVER的,Oracle的叫啥我就不清楚了。

 

楼下的解决方案适用于两级树,用递归可以适用于N级树。

爱编程的大叔 | 园豆:30844 (高人七级) | 2016-03-04 10:42

@爱编程的大叔: 

好的 谢谢大叔!!!

xuliyuan173 | 园豆:249 (菜鸟二级) | 2016-03-04 10:43

@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)

类似这样,有语法错误,你改改。

爱编程的大叔 | 园豆:30844 (高人七级) | 2016-03-04 10:49

@爱编程的大叔: 我开始也是这样的想法,但是应为父节点的数量不固定,所以这条语句会Join很多表。

xuliyuan173 | 园豆:249 (菜鸟二级) | 2016-03-04 10:51

@xuliyuan173: 这时候我会建议你用程序代码解决的。

一般这种树存储的数据不会太多,无需担心性能问题。

所以任何一个方法可以解决就行,不要纠结于一句SQL解决。

爱编程的大叔 | 园豆:30844 (高人七级) | 2016-03-04 10:54

@爱编程的大叔: 恩 好的 谢谢 :)

xuliyuan173 | 园豆:249 (菜鸟二级) | 2016-03-04 10:55
其他回答(1)
0

select dbms_random.value(0,100)  from dual

刘宏玺 | 园豆:14020 (专家六级) | 2016-03-04 10:26

大侠,您这出的是随机数啊

支持(0) 反对(0) xuliyuan173 | 园豆:249 (菜鸟二级) | 2016-03-04 10:38

select t1.name ,t2.name from table t1 left join table t2 on t1.pid <> t2.pid where t1.pid <> 0

支持(0) 反对(0) 刘宏玺 | 园豆:14020 (专家六级) | 2016-03-04 10:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册