楼主: qingyun

[精华] 爱因斯坦的一个问题如何用Pl/sql实现

[复制链接]
论坛徽章:
3
CTO参与奖
日期:2009-01-15 11:42:462010新春纪念徽章
日期:2010-01-04 08:33:08ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
21#
发表于 2009-12-31 10:59 | 只看该作者
newkid的写法,每个类的排列并不是全排列,得到的记录数比全排列的纪录数量要多。
另外,在我的机器上,在sqlplus里和pl/sql developer里执行newkid的语句,结果都为空:未选定行
不知为什么,难道是人品问题。

我在newkid的基础上,改了一下,每个类为全排列。



SET heading OFF
SET linesize 80
column s1 format a15
column s2 format a15
column s3 format a15
column s4 format a15
column s5 format a15

WITH class_nationality AS
(SELECT '英国人' AS s
    FROM dual
  UNION ALL
  SELECT '瑞典人'
    FROM dual
  UNION ALL
  SELECT '丹麦人'
    FROM dual
  UNION ALL
  SELECT '挪威人'
    FROM dual
  UNION ALL
  SELECT '德国人' FROM dual),
class_house AS
(SELECT '红色' AS s
    FROM dual
  UNION ALL
  SELECT '白色'
    FROM dual
  UNION ALL
  SELECT '绿色'
    FROM dual
  UNION ALL
  SELECT '黄色'
    FROM dual
  UNION ALL
  SELECT '蓝色' FROM dual),
class_beverages AS
(SELECT '茶' AS s
    FROM dual
  UNION ALL
  SELECT '咖啡'
    FROM dual
  UNION ALL
  SELECT '牛奶'
    FROM dual
  UNION ALL
  SELECT '啤酒'
    FROM dual
  UNION ALL
  SELECT '水' FROM dual),
class_cigarettes AS
(SELECT 'pall mall' AS s
    FROM dual
  UNION ALL
  SELECT 'dunhill'
    FROM dual
  UNION ALL
  SELECT 'blends'
    FROM dual
  UNION ALL
  SELECT 'blue master'
    FROM dual
  UNION ALL
  SELECT 'prince' FROM dual),
class_pets AS
(SELECT '狗' AS s
    FROM dual
  UNION ALL
  SELECT '鸟'
    FROM dual
  UNION ALL
  SELECT '猫'
    FROM dual
  UNION ALL
  SELECT '马'
    FROM dual
  UNION ALL
  SELECT '鱼' FROM dual),
nationality AS
(SELECT a1.s s1, a2.s s2, a3.s s3, a4.s s4, a5.s s5
    FROM class_nationality a1,
         class_nationality a2,
         class_nationality a3,
         class_nationality a4,
         class_nationality a5
   WHERE a1.s <> a2.s
     AND a1.s <> a3.s
     AND a1.s <> a4.s
     AND a1.s <> a5.s
     AND a2.s <> a3.s
     AND a2.s <> a4.s
     AND a2.s <> a5.s
     AND a3.s <> a4.s
     AND a3.s <> a5.s
     AND a4.s <> a5.s),
house AS
(SELECT a1.s s1, a2.s s2, a3.s s3, a4.s s4, a5.s s5
    FROM class_house a1,
         class_house a2,
         class_house a3,
         class_house a4,
         class_house a5
   WHERE a1.s <> a2.s
     AND a1.s <> a3.s
     AND a1.s <> a4.s
     AND a1.s <> a5.s
     AND a2.s <> a3.s
     AND a2.s <> a4.s
     AND a2.s <> a5.s
     AND a3.s <> a4.s
     AND a3.s <> a5.s
     AND a4.s <> a5.s),
beverages AS
(SELECT a1.s s1, a2.s s2, a3.s s3, a4.s s4, a5.s s5
    FROM class_beverages a1,
         class_beverages a2,
         class_beverages a3,
         class_beverages a4,
         class_beverages a5
   WHERE a1.s <> a2.s
     AND a1.s <> a3.s
     AND a1.s <> a4.s
     AND a1.s <> a5.s
     AND a2.s <> a3.s
     AND a2.s <> a4.s
     AND a2.s <> a5.s
     AND a3.s <> a4.s
     AND a3.s <> a5.s
     AND a4.s <> a5.s),
cigarettes AS
(SELECT a1.s s1, a2.s s2, a3.s s3, a4.s s4, a5.s s5
    FROM class_cigarettes a1,
         class_cigarettes a2,
         class_cigarettes a3,
         class_cigarettes a4,
         class_cigarettes a5
   WHERE a1.s <> a2.s
     AND a1.s <> a3.s
     AND a1.s <> a4.s
     AND a1.s <> a5.s
     AND a2.s <> a3.s
     AND a2.s <> a4.s
     AND a2.s <> a5.s
     AND a3.s <> a4.s
     AND a3.s <> a5.s
     AND a4.s <> a5.s),
pets AS
(SELECT a1.s s1, a2.s s2, a3.s s3, a4.s s4, a5.s s5
    FROM class_pets a1,
         class_pets a2,
         class_pets a3,
         class_pets a4,
         class_pets a5
   WHERE a1.s <> a2.s
     AND a1.s <> a3.s
     AND a1.s <> a4.s
     AND a1.s <> a5.s
     AND a2.s <> a3.s
     AND a2.s <> a4.s
     AND a2.s <> a5.s
     AND a3.s <> a4.s
     AND a3.s <> a5.s
     AND a4.s <> a5.s)
SELECT nationality.s1,
       nationality.s2,
       nationality.s3,
       nationality.s4,
       nationality.s5,
       house.s1,
       house.s2,
       house.s3,
       house.s4,
       house.s5,
       beverages.s1,
       beverages.s2,
       beverages.s3,
       beverages.s4,
       beverages.s5,
       cigarettes.s1,
       cigarettes.s2,
       cigarettes.s3,
       cigarettes.s4,
       cigarettes.s5,
       pets.s1,
       pets.s2,
       pets.s3,
       pets.s4,
       pets.s5
  FROM nationality, house, beverages, cigarettes, pets
WHERE ('英国人', '红色') IN ((nationality.s1, house.s1),
                         (nationality.s2, house.s2),
                         (nationality.s3, house.s3),
                         (nationality.s4, house.s4),
                         (nationality.s5, house.s5))
   AND ('瑞典人', '狗') IN ((nationality.s1, pets.s1),
                        (nationality.s2, pets.s2),
                        (nationality.s3, pets.s3),
                        (nationality.s4, pets.s4),
                        (nationality.s5, pets.s5))
   AND ('丹麦人', '茶') IN ((nationality.s1, beverages.s1),
                        (nationality.s2, beverages.s2),
                        (nationality.s3, beverages.s3),
                        (nationality.s4, beverages.s4),
                        (nationality.s5, beverages.s5))
   AND ('绿色', '白色') IN ((house.s1, house.s2),
                        (house.s2, house.s3),
                        (house.s3, house.s4),
                        (house.s4, house.s5))
   AND ('绿色', '咖啡') IN ((house.s1, beverages.s1),
                        (house.s2, beverages.s2),
                        (house.s3, beverages.s3),
                        (house.s4, beverages.s4),
                        (house.s5, beverages.s5))
   AND ('pall mall', '鸟') IN
       ((cigarettes.s1, pets.s1),
        (cigarettes.s2, pets.s2),
        (cigarettes.s3, pets.s3),
        (cigarettes.s4, pets.s4),
        (cigarettes.s5, pets.s5))
   AND ('黄色', 'dunhill') IN
       ((house.s1, cigarettes.s1),
        (house.s2, cigarettes.s2),
        (house.s3, cigarettes.s3),
        (house.s4, cigarettes.s4),
        (house.s5, cigarettes.s5))
   AND '牛奶' = beverages.s3
   AND '挪威人' = nationality.s1
   AND ('blends', '猫') IN ((cigarettes.s1, pets.s2),
                           (cigarettes.s2, pets.s3),
                           (cigarettes.s3, pets.s4),
                           (cigarettes.s4, pets.s5),
                           (cigarettes.s2, pets.s1),
                           (cigarettes.s3, pets.s2),
                           (cigarettes.s4, pets.s3),
                           (cigarettes.s5, pets.s4))
   AND ('dunhill', '马') IN ((cigarettes.s1, pets.s2),
                            (cigarettes.s2, pets.s3),
                            (cigarettes.s3, pets.s4),
                            (cigarettes.s4, pets.s5),
                            (cigarettes.s2, pets.s1),
                            (cigarettes.s3, pets.s2),
                            (cigarettes.s4, pets.s3),
                            (cigarettes.s5, pets.s4))
   AND ('blue master', '啤酒') IN
       ((cigarettes.s1, beverages.s1),
        (cigarettes.s2, beverages.s2),
        (cigarettes.s3, beverages.s3),
        (cigarettes.s4, beverages.s4),
        (cigarettes.s5, beverages.s5))
   AND ('德国人', 'prince') IN
       ((nationality.s1, cigarettes.s1),
        (nationality.s2, cigarettes.s2),
        (nationality.s3, cigarettes.s3),
        (nationality.s4, cigarettes.s4),
        (nationality.s5, cigarettes.s5))
   AND '蓝色' = house.s2
   AND ('blends', '水') IN
       ((cigarettes.s1, beverages.s2),
        (cigarettes.s2, beverages.s3),
        (cigarettes.s3, beverages.s4),
        (cigarettes.s4, beverages.s5),
        (cigarettes.s2, beverages.s1),
        (cigarettes.s3, beverages.s2),
        (cigarettes.s4, beverages.s3),
        (cigarettes.s5, beverages.s4));

SET heading ON

/* 执行结果
SQL> @d:\einstein.sql

挪威人          丹麦人          英国人          德国人          瑞典人
黄色            蓝色            红色            绿色            白色
水              茶              牛奶            咖啡            啤酒
dunhill         blends          pall mall       prince          blue master
猫              马              鸟              鱼              狗


已用时间:  00: 00: 00.50
*/




Einstein Script Einstein.sql (7.86 KB, 下载次数: 33)

[ 本帖最后由 addm 于 2009-12-31 11:04 编辑 ]

使用道具 举报

回复
论坛徽章:
33
劳斯莱斯
日期:2013-08-08 14:01:23三菱
日期:2013-09-28 10:16:06一汽
日期:2013-11-19 17:01:11凯迪拉克
日期:2013-12-07 17:11:282014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02itpub13周年纪念徽章
日期:2014-09-27 14:20:21itpub13周年纪念徽章
日期:2014-10-08 15:13:38懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
22#
发表于 2009-12-31 11:04 | 只看该作者
原帖由 addm 于 2009-12-31 10:59 发表
newkid的写法,每个类的排列并不是全排列,得到的记录数比全排列的纪录数量要多。
另外,在我的机器上,在sqlplus里和pl/sql developer里执行newkid的语句,结果都为空:未选定行
不知为什么,难道是人品问题。

我在newkid的基础上,改了一下,每个类为全排列。



SET heading OFF
SET linesize 80
column s1 format a15
column s2 format a15
column s3 format a15
column s4 format a15
column s5 format a15

WITH class_nationality AS
(SELECT '英国人' AS s
    FROM dual
  UNION ALL
  SELECT '瑞典人'
    FROM dual
  UNION ALL
  SELECT '丹麦人'
    FROM dual
  UNION ALL
  SELECT '挪威人'
    FROM dual
  UNION ALL
  SELECT '德国人' FROM dual),
class_house AS
(SELECT '红色' AS s
    FROM dual
  UNION ALL
  SELECT '白色'
    FROM dual
  UNION ALL
  SELECT '绿色'
    FROM dual
  UNION ALL
  SELECT '黄色'
    FROM dual
  UNION ALL
  SELECT '蓝色' FROM dual),
class_beverages AS
(SELECT 茶' AS s
    FROM dual
  UNION ALL
  SELECT 咖啡'
    FROM dual
  UNION ALL
  SELECT '牛奶'
    FROM dual
  UNION ALL
  SELECT 啤酒'
    FROM dual
  UNION ALL
  SELECT '水' FROM dual),
class_cigarettes AS
(SELECT 'pall mall' AS s
    FROM dual
  UNION ALL
  SELECT 'dunhill'
    FROM dual
  UNION ALL
  SELECT 'blends'
    FROM dual
  UNION ALL
  SELECT 'blue master'
    FROM dual
  UNION ALL
  SELECT 'prince' FROM dual),
class_pets AS
(SELECT '狗' AS s
    FROM dual
  UNION ALL
  SELECT '鸟'
    FROM dual
  UNION ALL
  SELECT '猫'
    FROM dual
  UNION ALL
  SELECT '马'
    FROM dual
  UNION ALL
  SELECT '鱼' FROM dual),
nationality AS
(SELECT a1.s s1, a2.s s2, a3.s s3, a4.s s4, a5.s s5
    FROM class_nationality a1,
         class_nationality a2,
         class_nationality a3,
         class_nationality a4,
         class_nationality a5
   WHERE a1.s  a2.s
     AND a1.s  a3.s
     AND a1.s  a4.s
     AND a1.s  a5.s
     AND a2.s  a3.s
     AND a2.s  a4.s
     AND a2.s  a5.s
     AND a3.s  a4.s
     AND a3.s  a5.s
     AND a4.s  a5.s),
house AS
(SELECT a1.s s1, a2.s s2, a3.s s3, a4.s s4, a5.s s5
    FROM class_house a1,
         class_house a2,
         class_house a3,
         class_house a4,
         class_house a5
   WHERE a1.s  a2.s
     AND a1.s  a3.s
     AND a1.s  a4.s
     AND a1.s  a5.s
     AND a2.s  a3.s
     AND a2.s  a4.s
     AND a2.s  a5.s
     AND a3.s  a4.s
     AND a3.s  a5.s
     AND a4.s  a5.s),
beverages AS
(SELECT a1.s s1, a2.s s2, a3.s s3, a4.s s4, a5.s s5
    FROM class_beverages a1,
         class_beverages a2,
         class_beverages a3,
         class_beverages a4,
         class_beverages a5
   WHERE a1.s  a2.s
     AND a1.s  a3.s
     AND a1.s  a4.s
     AND a1.s  a5.s
     AND a2.s  a3.s
     AND a2.s  a4.s
     AND a2.s  a5.s
     AND a3.s  a4.s
     AND a3.s  a5.s
     AND a4.s  a5.s),
cigarettes AS
(SELECT a1.s s1, a2.s s2, a3.s s3, a4.s s4, a5.s s5
    FROM class_cigarettes a1,
         class_cigarettes a2,
         class_cigarettes a3,
         class_cigarettes a4,
         class_cigarettes a5
   WHERE a1.s  a2.s
     AND a1.s  a3.s
     AND a1.s  a4.s
     AND a1.s  a5.s
     AND a2.s  a3.s
     AND a2.s  a4.s
     AND a2.s  a5.s
     AND a3.s  a4.s
     AND a3.s  a5.s
     AND a4.s  a5.s),
pets AS
(SELECT a1.s s1, a2.s s2, a3.s s3, a4.s s4, a5.s s5
    FROM class_pets a1,
         class_pets a2,
         class_pets a3,
         class_pets a4,
         class_pets a5
   WHERE a1.s  a2.s
     AND a1.s  a3.s
     AND a1.s  a4.s
     AND a1.s  a5.s
     AND a2.s  a3.s
     AND a2.s  a4.s
     AND a2.s  a5.s
     AND a3.s  a4.s
     AND a3.s  a5.s
     AND a4.s  a5.s)
SELECT nationality.s1,
       nationality.s2,
       nationality.s3,
       nationality.s4,
       nationality.s5,
       house.s1,
       house.s2,
       house.s3,
       house.s4,
       house.s5,
       beverages.s1,
       beverages.s2,
       beverages.s3,
       beverages.s4,
       beverages.s5,
       cigarettes.s1,
       cigarettes.s2,
       cigarettes.s3,
       cigarettes.s4,
       cigarettes.s5,
       pets.s1,
       pets.s2,
       pets.s3,
       pets.s4,
       pets.s5
  FROM nationality, house, beverages, cigarettes, pets
WHERE ('英国人', '红色') IN ((nationality.s1, house.s1),
                         (nationality.s2, house.s2),
                         (nationality.s3, house.s3),
                         (nationality.s4, house.s4),
                         (nationality.s5, house.s5))
   AND ('瑞典人', '狗') IN ((nationality.s1, pets.s1),
                        (nationality.s2, pets.s2),
                        (nationality.s3, pets.s3),
                        (nationality.s4, pets.s4),
                        (nationality.s5, pets.s5))
   AND ('丹麦人', 茶') IN ((nationality.s1, beverages.s1),
                        (nationality.s2, beverages.s2),
                        (nationality.s3, beverages.s3),
                        (nationality.s4, beverages.s4),
                        (nationality.s5, beverages.s5))
   AND ('绿色', '白色') IN ((house.s1, house.s2),
                        (house.s2, house.s3),
                        (house.s3, house.s4),
                        (house.s4, house.s5))
   AND ('绿色', 咖啡') IN ((house.s1, beverages.s1),
                        (house.s2, beverages.s2),
                        (house.s3, beverages.s3),
                        (house.s4, beverages.s4),
                        (house.s5, beverages.s5))
   AND ('pall mall', '鸟') IN
       ((cigarettes.s1, pets.s1),
        (cigarettes.s2, pets.s2),
        (cigarettes.s3, pets.s3),
        (cigarettes.s4, pets.s4),
        (cigarettes.s5, pets.s5))
   AND ('黄色', 'dunhill') IN
       ((house.s1, cigarettes.s1),
        (house.s2, cigarettes.s2),
        (house.s3, cigarettes.s3),
        (house.s4, cigarettes.s4),
        (house.s5, cigarettes.s5))
   AND '牛奶' = beverages.s3
   AND '挪威人' = nationality.s1
   AND ('blends', '猫') IN ((cigarettes.s1, pets.s2),
                           (cigarettes.s2, pets.s3),
                           (cigarettes.s3, pets.s4),
                           (cigarettes.s4, pets.s5),
                           (cigarettes.s2, pets.s1),
                           (cigarettes.s3, pets.s2),
                           (cigarettes.s4, pets.s3),
                           (cigarettes.s5, pets.s4))
   AND ('dunhill', '马') IN ((cigarettes.s1, pets.s2),
                            (cigarettes.s2, pets.s3),
                            (cigarettes.s3, pets.s4),
                            (cigarettes.s4, pets.s5),
                            (cigarettes.s2, pets.s1),
                            (cigarettes.s3, pets.s2),
                            (cigarettes.s4, pets.s3),
                            (cigarettes.s5, pets.s4))
   AND ('blue master', 啤酒') IN
       ((cigarettes.s1, beverages.s1),
        (cigarettes.s2, beverages.s2),
        (cigarettes.s3, beverages.s3),
        (cigarettes.s4, beverages.s4),
        (cigarettes.s5, beverages.s5))
   AND ('德国人', 'prince') IN
       ((nationality.s1, cigarettes.s1),
        (nationality.s2, cigarettes.s2),
        (nationality.s3, cigarettes.s3),
        (nationality.s4, cigarettes.s4),
        (nationality.s5, cigarettes.s5))
   AND '蓝色' = house.s2
   AND ('blends', '水') IN
       ((cigarettes.s1, beverages.s2),
        (cigarettes.s2, beverages.s3),
        (cigarettes.s3, beverages.s4),
        (cigarettes.s4, beverages.s5),
        (cigarettes.s2, beverages.s1),
        (cigarettes.s3, beverages.s2),
        (cigarettes.s4, beverages.s3),
        (cigarettes.s5, beverages.s4));

SET heading ON

/* 执行结果
SQL> @d:\einstein.sql

挪威人          丹麦人          英国人          德国人          瑞典人
黄色            蓝色            红色            绿色            白色
水              茶              牛奶            咖啡            啤酒
dunhill         blends          pall mall       prince          blue master
猫              马              鸟              鱼              狗


已用时间:  00: 00: 00.50
*/



Einstein Script646105

使用道具 举报

回复
论坛徽章:
15
授权会员
日期:2009-04-13 17:01:142010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:04:59ITPUB元老
日期:2010-11-30 19:08:482011新春纪念徽章
日期:2011-01-04 10:24:02生肖徽章2007版:兔
日期:2011-01-20 12:58:49ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
23#
发表于 2009-12-31 23:53 | 只看该作者
都是聪明人。。。。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
24#
发表于 2009-12-31 23:59 | 只看该作者
原帖由 addm 于 2009-12-31 10:59 发表
newkid的写法,每个类的排列并不是全排列,得到的记录数比全排列的纪录数量要多。
另外,在我的机器上,在sqlplus里和pl/sql developer里执行newkid的语句,结果都为空:未选定行
不知为什么,难道是人品问题。

我在newkid的基础上,改了一下,每个类为全排列。

Einstein Script646105


我用的CONNECT BY NOCYCLE确实是全排列呀?如果你看一下子查询结果,就会发现有5!=120行。
至于你看不到结果,应该是字符集问题,我为了省事就先用RPAD对齐再用SUBSTR取出。改用INSTR或REGEXP_SUBSTR来解析应该可以。或者去掉汉字改用英文:


WITH class_nationality as (
          SELECT 'Englishman' as s FROM dual
          union all
          SELECT 'Swede' FROM dual
          union all
          SELECT 'Dane' FROM dual
          union all
          SELECT 'Norwegian' FROM dual
          union all
          SELECT 'German' FROM dual
     ),
     class_house as(
          SELECT 'red' as s FROM dual
          union all
          SELECT 'white' FROM dual
          union all
          SELECT 'green' FROM dual
          union all
          SELECT 'yellow' FROM dual
          union all
          SELECT 'blue' FROM dual
     ),
     class_beverages as(
          SELECT 'tea' as s FROM dual
          union all
          SELECT 'coffee' FROM dual
          union all
          SELECT 'milk' FROM dual
          union all
          SELECT 'beer' FROM dual
          union all
          SELECT 'water' FROM dual
     ),
     class_cigarettes as(
          SELECT 'pall mall' as s FROM dual
          union all
          SELECT 'dunhill' FROM dual
          union all
          SELECT 'blends' FROM dual
          union all
          SELECT 'blue master' FROM dual
          union all
          SELECT 'prince' FROM dual
     ),
     class_pets as(
          SELECT 'dog' as s FROM dual
          union all
          SELECT 'bird' FROM dual
          union all
          SELECT 'cat' FROM dual
          union all
          SELECT 'horse' FROM dual
          union all
          SELECT 'fish' FROM dual
     )   
     ,nationality AS (
       SELECT TRIM(SUBSTR(p,2 ,19)) AS s1
             ,TRIM(SUBSTR(p,22,19)) AS s2
             ,TRIM(SUBSTR(p,42,19)) AS s3
             ,TRIM(SUBSTR(p,62,19)) AS s4
             ,TRIM(SUBSTR(p,82,19)) AS s5
         FROM (SELECT SYS_CONNECT_BY_PATH(RPAD(s,19),'\') AS p
                 FROM class_nationality
                WHERE LEVEL=5
                CONNECT BY NOCYCLE LEVEL<=5 AND s<>PRIOR s
                )
        )
    ,house AS (
       SELECT TRIM(SUBSTR(p,2 ,19)) AS s1
             ,TRIM(SUBSTR(p,22,19)) AS s2
             ,TRIM(SUBSTR(p,42,19)) AS s3
             ,TRIM(SUBSTR(p,62,19)) AS s4
             ,TRIM(SUBSTR(p,82,19)) AS s5
         FROM (SELECT SYS_CONNECT_BY_PATH(RPAD(s,19),'\') AS p
                 FROM class_house
                WHERE LEVEL=5
                CONNECT BY NOCYCLE LEVEL<=5 AND s<>PRIOR s
                )
        )
    ,beverages AS (
       SELECT TRIM(SUBSTR(p,2 ,19)) AS s1
             ,TRIM(SUBSTR(p,22,19)) AS s2
             ,TRIM(SUBSTR(p,42,19)) AS s3
             ,TRIM(SUBSTR(p,62,19)) AS s4
             ,TRIM(SUBSTR(p,82,19)) AS s5
         FROM (SELECT SYS_CONNECT_BY_PATH(RPAD(s,19),'\') AS p
                 FROM class_beverages
                WHERE LEVEL=5
                CONNECT BY NOCYCLE LEVEL<=5 AND s<>PRIOR s
                )
        )
    ,cigarettes AS (
       SELECT TRIM(SUBSTR(p,2 ,19)) AS s1
             ,TRIM(SUBSTR(p,22,19)) AS s2
             ,TRIM(SUBSTR(p,42,19)) AS s3
             ,TRIM(SUBSTR(p,62,19)) AS s4
             ,TRIM(SUBSTR(p,82,19)) AS s5
         FROM (SELECT SYS_CONNECT_BY_PATH(RPAD(s,19),'\') AS p
                 FROM class_cigarettes
                WHERE LEVEL=5
                CONNECT BY NOCYCLE LEVEL<=5 AND s<>PRIOR s
                )
        )
    ,pets AS (
       SELECT TRIM(SUBSTR(p,2 ,19)) AS s1
             ,TRIM(SUBSTR(p,22,19)) AS s2
             ,TRIM(SUBSTR(p,42,19)) AS s3
             ,TRIM(SUBSTR(p,62,19)) AS s4
             ,TRIM(SUBSTR(p,82,19)) AS s5
         FROM (SELECT SYS_CONNECT_BY_PATH(RPAD(s,19),'\') AS p
                 FROM class_pets
                WHERE LEVEL=5
                CONNECT BY NOCYCLE LEVEL<=5 AND s<>PRIOR s
                )
        )
SELECT RPAD(nationality.s1,16)||RPAD(house.s1,16)||RPAD(beverages.s1,16)||RPAD(cigarettes.s1,16)||RPAD(pets.s1,16)||CHR(10)||
       RPAD(nationality.s2,16)||RPAD(house.s2,16)||RPAD(beverages.s2,16)||RPAD(cigarettes.s2,16)||RPAD(pets.s2,16)||CHR(10)||
       RPAD(nationality.s3,16)||RPAD(house.s3,16)||RPAD(beverages.s3,16)||RPAD(cigarettes.s3,16)||RPAD(pets.s3,16)||CHR(10)||
       RPAD(nationality.s4,16)||RPAD(house.s4,16)||RPAD(beverages.s4,16)||RPAD(cigarettes.s4,16)||RPAD(pets.s4,16)||CHR(10)||
       RPAD(nationality.s5,16)||RPAD(house.s5,16)||RPAD(beverages.s5,16)||RPAD(cigarettes.s5,16)||RPAD(pets.s5,16) AS RESULT
  FROM nationality
      ,house
      ,beverages
      ,cigarettes
      ,pets           
WHERE ('Englishman','red')   IN ((nationality.s1,house.s1),(nationality.s2,house.s2),(nationality.s3,house.s3),(nationality.s4,house.s4),(nationality.s5,house.s5))
  AND ('Swede','dog')        IN ((nationality.s1,pets.s1),(nationality.s2,pets.s2),(nationality.s3,pets.s3),(nationality.s4,pets.s4),(nationality.s5,pets.s5))
  AND ('Dane','tea')         IN ((nationality.s1,beverages.s1),(nationality.s2,beverages.s2),(nationality.s3,beverages.s3),(nationality.s4,beverages.s4),(nationality.s5,beverages.s5))
  AND ('green','white')      IN ((house.s1,house.s2),(house.s2,house.s3),(house.s3,house.s4),(house.s4,house.s5))
  AND ('green','coffee')     IN ((house.s1,beverages.s1),(house.s2,beverages.s2),(house.s3,beverages.s3),(house.s4,beverages.s4),(house.s5,beverages.s5))
  AND ('pall mall','bird')   IN ((cigarettes.s1,pets.s1),(cigarettes.s2,pets.s2),(cigarettes.s3,pets.s3),(cigarettes.s4,pets.s4),(cigarettes.s5,pets.s5))
  AND ('yellow','dunhill')   IN ((house.s1,cigarettes.s1),(house.s2,cigarettes.s2),(house.s3,cigarettes.s3),(house.s4,cigarettes.s4),(house.s5,cigarettes.s5))
  AND 'milk'                 =  beverages.s3  
  AND 'Norwegian'            =  nationality.s1
  AND ('blends','cat')       IN ((cigarettes.s1,pets.s2),(cigarettes.s2,pets.s3),(cigarettes.s3,pets.s4),(cigarettes.s4,pets.s5),(cigarettes.s2,pets.s1),(cigarettes.s3,pets.s2),(cigarettes.s4,pets.s3),(cigarettes.s5,pets.s4))
  AND ('dunhill','horse')    IN ((cigarettes.s1,pets.s2),(cigarettes.s2,pets.s3),(cigarettes.s3,pets.s4),(cigarettes.s4,pets.s5),(cigarettes.s2,pets.s1),(cigarettes.s3,pets.s2),(cigarettes.s4,pets.s3),(cigarettes.s5,pets.s4))
  AND ('blue master','beer') IN ((cigarettes.s1,beverages.s1),(cigarettes.s2,beverages.s2),(cigarettes.s3,beverages.s3),(cigarettes.s4,beverages.s4),(cigarettes.s5,beverages.s5))
  AND ('German','prince')    IN ((nationality.s1,cigarettes.s1),(nationality.s2,cigarettes.s2),(nationality.s3,cigarettes.s3),(nationality.s4,cigarettes.s4),(nationality.s5,cigarettes.s5))
  AND 'blue'                 =  house.s2
  AND ('blends','water')     IN ((cigarettes.s1,beverages.s2),(cigarettes.s2,beverages.s3),(cigarettes.s3,beverages.s4),(cigarettes.s4,beverages.s5),(cigarettes.s2,beverages.s1),(cigarettes.s3,beverages.s2),(cigarettes.s4,beverages.s3),(cigarettes.s5,beverages.s4))

RESULT
--------------------------------------------------------------------------------------

Norwegian       yellow          water           dunhill         cat
Dane            blue            tea             blends          horse
Englishman      red             milk            pall mall       bird
German          green           coffee          prince          fish
Swede           white           beer            blue master     dog

你用的全排列方法和jackywood差不多,我改用CONNECT BY就是为了避免写那么多不等连接条件。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
25#
发表于 2010-1-1 00:04 | 只看该作者
原帖由 风铃中の鬼 于 2009-12-31 10:21 发表



多谢指点,后来发现问题还不只这点。。还需要判断每行的6个列与其他的6列互不相同(序号,国际,颜色,饮料,香烟,宠物)
判断互不相同的方法除了jackwood用的那个方法,还有没有其他的方法了?

如果这道题没有给那15个提示,只要求统计出有多少种满足题目条件的排列(1.在一条街上,有5座房子,喷了5种颜色. 2.每个房里住着不同国籍的人. 3.每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物. ),那这样应该怎么写SQL?


jackywood用不等连接,我用CONNECT BY, 殊途同归。最后都是返回一行,用的是列间比较。

你后面的问题可以参考我的做法,把WHERE去掉就是了。

使用道具 举报

回复
论坛徽章:
468
26#
发表于 2010-1-1 12:09 | 只看该作者
手算过

使用道具 举报

回复
论坛徽章:
23
生肖徽章2007版:蛇
日期:2008-01-02 17:35:53生肖徽章2007版:狗
日期:2009-03-10 21:17:06生肖徽章2007版:虎
日期:2009-03-10 21:20:05生肖徽章2007版:龙
日期:2009-03-10 21:27:46生肖徽章2007版:蛇
日期:2009-03-10 21:34:302009日食纪念
日期:2009-07-22 09:30:00ITPUB8周年纪念徽章
日期:2009-09-27 10:21:21祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:21:01
27#
发表于 2010-1-1 12:43 | 只看该作者
高手

使用道具 举报

回复
论坛徽章:
3
CTO参与奖
日期:2009-01-15 11:42:462010新春纪念徽章
日期:2010-01-04 08:33:08ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
28#
发表于 2010-1-2 23:11 | 只看该作者
原帖由 newkid 于 2009-12-31 23:59 发表


我用的CONNECT BY NOCYCLE确实是全排列呀?如果你看一下子查询结果,就会发现有5!=120行。
至于你看不到结果,应该是字符集问题,我为了省事就先用RPAD对齐再用SUBSTR取出。改用INSTR或REGEXP_SUBSTR来解析应该可以。或者去掉汉字改用英文:


WITH class_nationality as (
          SELECT 'Englishman' as s FROM dual
          union all
          SELECT 'Swede' FROM dual
          union all
          SELECT 'Dane' FROM dual
          union all
          SELECT 'Norwegian' FROM dual
          union all
          SELECT 'German' FROM dual
     ),
     class_house as(
          SELECT 'red' as s FROM dual
          union all
          SELECT 'white' FROM dual
          union all
          SELECT 'green' FROM dual
          union all
          SELECT 'yellow' FROM dual
          union all
          SELECT 'blue' FROM dual
     ),
     class_beverages as(
          SELECT 'tea' as s FROM dual
          union all
          SELECT 'coffee' FROM dual
          union all
          SELECT 'milk' FROM dual
          union all
          SELECT 'beer' FROM dual
          union all
          SELECT 'water' FROM dual
     ),
     class_cigarettes as(
          SELECT 'pall mall' as s FROM dual
          union all
          SELECT 'dunhill' FROM dual
          union all
          SELECT 'blends' FROM dual
          union all
          SELECT 'blue master' FROM dual
          union all
          SELECT 'prince' FROM dual
     ),
     class_pets as(
          SELECT 'dog' as s FROM dual
          union all
          SELECT 'bird' FROM dual
          union all
          SELECT 'cat' FROM dual
          union all
          SELECT 'horse' FROM dual
          union all
          SELECT 'fish' FROM dual
     )   
     ,nationality AS (
       SELECT TRIM(SUBSTR(p,2 ,19)) AS s1
             ,TRIM(SUBSTR(p,22,19)) AS s2
             ,TRIM(SUBSTR(p,42,19)) AS s3
             ,TRIM(SUBSTR(p,62,19)) AS s4
             ,TRIM(SUBSTR(p,82,19)) AS s5
         FROM (SELECT SYS_CONNECT_BY_PATH(RPAD(s,19),'\') AS p
                 FROM class_nationality
                WHERE LEVEL=5
                CONNECT BY NOCYCLE LEVEL


你是对的,我没看到nocycle。
新年愉快!

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
29#
发表于 2010-1-3 09:53 | 只看该作者
昨晚想这道题失眠了

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
30#
发表于 2010-1-3 19:48 | 只看该作者
如果要穷举所有可能的组合,从中找到一行符合要求的方法太笨了
房序号、颜色、国家、喝、吸、养每个都有5!个排列。一共就是120^6种

使用道具 举报

回复

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

本版积分规则 发表回复

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