查看: 29009|回复: 26

sql语句如何实现排列组合?

[复制链接]
论坛徽章:
1
优秀写手
日期:2014-02-08 06:00:03
跳转到指定楼层
1#
发表于 2007-4-27 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在我有一个users表,如下:
NAME       VALUE      ID
---------- ---------- ----------
甲         a          1
乙         b          2
丙         c          3
丁         d          4
现在,需要对他们进行两两组合,比如说ab和ba就是一样的,现在需要利用select语句查询出所有abcd的两两组合的情况,最后的结果应该是6个,ab,ac,ad,bc,bd,cd,请问利用sql语句如何实现以上的查询?
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
2#
发表于 2007-4-27 10:16 | 只看该作者
[php]
select prior value, value
  from users
where level = 2
connect by value > prior value
       and level <= 2;

PRIORVALUE VALUE
---------- -----
a          b
a          c
a          d
b          c
b          d
c          d

6 rows selected
......
[/php]

使用道具 举报

回复
论坛徽章:
13
奥运会纪念徽章:手球
日期:2008-08-03 14:47:20灰彻蛋
日期:2013-05-19 21:13:392013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:202012新春纪念徽章
日期:2012-01-04 11:51:22咸鸭蛋
日期:2011-11-12 20:48:02ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15蜘蛛蛋
日期:2011-08-07 22:57:25迷宫蛋
日期:2011-08-04 22:49:40茶鸡蛋
日期:2011-07-16 21:17:38
3#
发表于 2007-4-27 10:30 | 只看该作者
select a.value||b.value result
from test_j a,test_j b
where a.rowid<>b.rowid
and a.value <b.value
order by result
-------------------------------------
result

ab
ac
ad
bc
bd
cd

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-02-08 06:00:03
4#
 楼主| 发表于 2007-4-27 11:02 | 只看该作者
谢谢

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
5#
发表于 2007-4-27 11:23 | 只看该作者
最初由 shiyisaniya 发布
[B]select a.value||b.value result
from test_j a,test_j b
where a.rowid<>b.rowid
and a.value <b.value
order by result
-------------------------------------
result

ab
ac
ad
bc
bd
cd [/B]


不错!

使用道具 举报

回复
论坛徽章:
73
2010新春纪念徽章
日期:2010-03-01 11:06:132011新春纪念徽章
日期:2011-02-18 11:43:332012新春纪念徽章
日期:2012-01-04 11:55:422013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有车
日期:2015-01-19 09:45:33最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-11-27 10:16:10问答徽章
日期:2013-10-23 15:13:22林肯
日期:2013-11-02 08:34:46
6#
发表于 2010-3-25 14:17 | 只看该作者
base data
SQL> create table users (name char(2),value char(1),id number);

Table created

SQL> insert into users values('甲','a',1);

1 row inserted

SQL> insert into users values('乙','b',2);

1 row inserted

SQL> insert into users values('丙','c',3);

1 row inserted

SQL> insert into users values('丁','d',4);

1 row inserted

SQL> commit;

Commit complete

SQL> select * from users;

NAME VALUE         ID
---- ----- ----------
甲   a              1
乙   b              2
丙   c              3
丁   d              4

使用道具 举报

回复
论坛徽章:
73
2010新春纪念徽章
日期:2010-03-01 11:06:132011新春纪念徽章
日期:2011-02-18 11:43:332012新春纪念徽章
日期:2012-01-04 11:55:422013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有车
日期:2015-01-19 09:45:33最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-11-27 10:16:10问答徽章
日期:2013-10-23 15:13:22林肯
日期:2013-11-02 08:34:46
7#
发表于 2010-3-25 14:18 | 只看该作者

排列

SQL> select o.p as "排列" from
  2  (select replace (sys_connect_by_path( value, ',' ) , ',' ) p
  3  from users connect by nocycle value != prior value) o
  4  where length(o.p) =2;

排列
--------------------------------------------------------------------------------
ab
ac
ad
ba
bc
bd
ca
cb
cd
da
db
dc

12 rows selected

SQL> select o.p as "排列" from
  2  (select replace (sys_connect_by_path( value, ',' ) , ',' ) p
  3  from users connect by nocycle value != prior value) o
  4  where length(o.p) =3;

排列
--------------------------------------------------------------------------------
abc
abd
acb
acd
adb
adc
bac
bad
bca
bcd
bda
bdc
cab
cad
cba
cbd
cda
cdb
dab
dac

排列
--------------------------------------------------------------------------------
dba
dbc
dca
dcb

24 rows selected

SQL>
SQL> select o.p as "排列" from
  2  (select replace (sys_connect_by_path( value, ',' ) , ',' ) p
  3  from users connect by nocycle value != prior value) o
  4  where length(o.p) =4;

排列
--------------------------------------------------------------------------------
abcd
abdc
acbd
acdb
adbc
adcb
bacd
badc
bcad
bcda
bdac
bdca
cabd
cadb
cbad
cbda
cdab
cdba
dabc
dacb

排列
--------------------------------------------------------------------------------
dbac
dbca
dcab
dcba

24 rows selected

[ 本帖最后由 XQKA 于 2010-3-25 14:24 编辑 ]

使用道具 举报

回复
论坛徽章:
73
2010新春纪念徽章
日期:2010-03-01 11:06:132011新春纪念徽章
日期:2011-02-18 11:43:332012新春纪念徽章
日期:2012-01-04 11:55:422013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有车
日期:2015-01-19 09:45:33最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-11-27 10:16:10问答徽章
日期:2013-10-23 15:13:22林肯
日期:2013-11-02 08:34:46
8#
发表于 2010-3-25 14:19 | 只看该作者

组合

SQL> select replace (a.combo, '#') as "组合"
  2  from
  3    (select id,sys_connect_by_path (value, '#') || '#' combo
  4            from (select 1 as id,value,1 as ctrl from users)
  5            connect by prior id = id and value > prior value ) a,
  6                   (select 1 as id,value,1 as ctrl from users) b
  7     where b.id = a.id and instr (a.combo, '#' || b.value || '#') > 0
  8  group by a.id, a.combo
  9  having sum (b.ctrl) = 2;

组合
--------------------------------------------------------------------------------
ab
bd
ac
cd
bc
ad

6 rows selected

SQL>
SQL> select replace (a.combo, '#') as "组合"
  2  from
  3    (select id,sys_connect_by_path (value, '#') || '#' combo
  4            from (select 1 as id,value,1 as ctrl from users)
  5            connect by prior id = id and value > prior value ) a,
  6                   (select 1 as id,value,1 as ctrl from users) b
  7     where b.id = a.id and instr (a.combo, '#' || b.value || '#') > 0
  8  group by a.id, a.combo
  9  having sum (b.ctrl) = 3;

组合
--------------------------------------------------------------------------------
acd
abc
abd
bcd

SQL>
SQL> select replace (a.combo, '#') as "组合"
  2  from
  3    (select id,sys_connect_by_path (value, '#') || '#' combo
  4            from (select 1 as id,value,1 as ctrl from users)
  5            connect by prior id = id and value > prior value ) a,
  6                   (select 1 as id,value,1 as ctrl from users) b
  7     where b.id = a.id and instr (a.combo, '#' || b.value || '#') > 0
  8  group by a.id, a.combo
  9  having sum (b.ctrl) = 4;

组合
--------------------------------------------------------------------------------
abcd


asktom.com

使用道具 举报

回复
论坛徽章:
73
2010新春纪念徽章
日期:2010-03-01 11:06:132011新春纪念徽章
日期:2011-02-18 11:43:332012新春纪念徽章
日期:2012-01-04 11:55:422013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有车
日期:2015-01-19 09:45:33最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-11-27 10:16:10问答徽章
日期:2013-10-23 15:13:22林肯
日期:2013-11-02 08:34:46
9#
发表于 2010-3-25 15:07 | 只看该作者
还是有点缺陷。
即,value有相同值的时候会失真。

SQL> update users set value='a' where id=4;

1 row updated

SQL> commit;

Commit complete

SQL> select * from users;

NAME VALUE         ID
---- ----- ----------
甲   a              1
乙   b              2
丙   c              3
丁   a              4

SQL>
SQL> select o.p as "排列" from
  2  (select replace (sys_connect_by_path( value, ',' ) , ',' ) p
  3  from users connect by nocycle value != prior value) o
  4  where length(o.p) =2;

排列
--------------------------------------------------------------------------------
ab
ac
ba
bc
ba
ca
cb
ca
ab
ac

10 rows selected

SQL>
SQL> select replace (a.combo, '#') as "组合"
  2  from
  3  (select id,sys_connect_by_path (value, '#') || '#' combo
  4              from (select 1 as id,value,1 as ctrl from users)
  5              connect by prior id = id and value > prior value ) a,
  6                    (select 1 as id,value,1 as ctrl from users) b
  7       where b.id = a.id and instr (a.combo, '#' || b.value || '#') > 0
  8    group by a.id, a.combo
  9    having sum (b.ctrl) = 2;

组合
--------------------------------------------------------------------------------
bc

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
4
设计板块每日发贴之星
日期:2007-09-08 01:05:20设计板块每日发贴之星
日期:2008-09-18 01:02:45设计板块每日发贴之星
日期:2009-06-10 01:01:03ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
10#
发表于 2010-3-25 15:09 | 只看该作者
依旧老问题

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表