請教高手,如果用P/L SQL得到一組數據的所有組合情況?

swallow_x 2006-04-27 03:41:39
請教各位高手,如果用P/L SQL得到一組數據的所有組合情況並存到一個table中?
例如:
初始數據:  1,2,3,4 (這個初始數據可能是n個)
  想要的結果
   batch_id no
1 1
2 2
3 3
4 4
5 1
5 2
6 1
6 3
    ... ...
以此類推

請大家幫幫忙 我想了好幾天也沒想出來
...全文
198 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
swallow_x 2006-04-29
  • 打赏
  • 举报
回复
To bobfang(匆匆过客)

還是不可以 可能真的是版本問題吧
我現在用另一個方法實現了
謝謝你
bobfang 2006-04-29
  • 打赏
  • 举报
回复
我是9.2.0.1,测试没有问题。你试试看看。
create table t1 as select rownum r from dual connect by rownum<=5;
create procedure p1(maxlevel number:=0)
as
v_maxlevel number;
begin
if maxlevel<=0 then
select count(*) into v_maxlevel from t1;
else
v_maxlevel:=maxlevel;
end if;
for t in (select substr(SYS_CONNECT_BY_PATH(r,','),2) s from t1 where level<=v_maxlevel connect by prior r<r) loop
dbms_output.put_line(t.s);
end loop;
end;
/
set serveroutput on
exec p1

swallow_x 2006-04-28
  • 打赏
  • 举报
回复
SYS_CONNECT_BY_PATH 是不是不可以用在function 或 procedure中呢?
有錯誤:identifier 'SYS_CONNECT_BY_PATH' must be declared
要怎麼解決呢?
heyixiang 2006-04-28
  • 打赏
  • 举报
回复
用SYS_CONNECT_BY_PATH连接字符受到长度的限制,不能超过4000。
swallow_x 2006-04-28
  • 打赏
  • 举报
回复
To bobfang(匆匆过客)

我們的數據庫版本是:ORACLE 9i(9.0.1.4)
單獨執行就可以的 是因為版本太低了嗎?
cxjd 2006-04-28
  • 打赏
  • 举报
回复
bobfang(匆匆过客)的方法比较不错
bobfang 2006-04-28
  • 打赏
  • 举报
回复
to swallow_x()
你数据库的版本
cxjd 2006-04-28
  • 打赏
  • 举报
回复
以此类推可以算出更多得数据
cxjd 2006-04-28
  • 打赏
  • 举报
回复
insert into table a
(
select a.a||b.b||c.c||d.d xx from
(select 1 a from dual union select null from dual) a,
(select 2 b from dual union select null from dual) b,
(select 3 c from dual union select null from dual) c,
(select 4 d from dual union select null from dual) d
where a.a||b.b||c.c||d.d is not null
)
cxjd 2006-04-28
  • 打赏
  • 举报
回复
select a.a||b.b||c.c||d.d from
(select 1 a from dual union select null from dual) a,
(select 2 b from dual union select null from dual) b,
(select 3 c from dual union select null from dual) c,
(select 4 d from dual union select null from dual) d
swallow_x 2006-04-27
  • 打赏
  • 举报
回复
bobfang(匆匆过客)
太強了 太感謝了 可是我不太理解 能否請您再解釋一下呢?
狂风乱影 2006-04-27
  • 打赏
  • 举报
回复
bobfang(匆匆过客) ( ):
CC:swallow_x ()
(1,2,1)应该也是一个组合吧?
狂风乱影 2006-04-27
  • 打赏
  • 举报
回复
那 那个表不是无穷大,如果指定组合的最大长度(维数),应该还是可以做成的
不过好麻烦哦。
呵呵~我还是用我上面的办法,
到时候根据维数来创建多个临时表;然后表和表之间用笛卡尔集得到当前维数的所有组合;然后再插到组合表。
想了一下
所谓的维数就是指:
(1),(2),(3),(4) 一维
(1,1),(1,2)。。。(4,1) 二维
1,1,2)。。 三维

这样的一个组合表有什么用?
xiaoxiao1984 2006-04-27
  • 打赏
  • 举报
回复
学习
bobfang 2006-04-27
  • 打赏
  • 举报
回复
SQL> set pages 20
SQL> select * from t1;

N
----------
1
2
3
4

SQL> select substr(SYS_CONNECT_BY_PATH(n,','),2) from t1 connect by prior n<n;

SUBSTR(SYS_CONNECT_BY_PATH(N,','),2)
--------------------------------------------------------------------------------
1
1,2
1,2,3
1,2,3,4
1,2,4
1,3
1,3,4
1,4
2
2,3
2,3,4
2,4
3
3,4
4

15 rows selected.
swallow_x 2006-04-27
  • 打赏
  • 举报
回复
不可以 我要的是每個組合的情況
(1),(2),(3),(4),(1,2),(1,3),(1,4),(1,2,3),(1,2,4)...
batch_id只是一個組合的編號,以便之後可以取出某種滿足條件的組合內容。
狂风乱影 2006-04-27
  • 打赏
  • 举报
回复
用笛卡尔集不行吗?
create table test1(Number1 number)
create table test2(Number2 number)

test1,test2中分别有数据[1,2,3,4,5,6]

select t1.Number1,t2.Number2 from test1 t1,test2 t2;

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧