skyiv

爱因斯坦的超级问题(谁养鱼)SQL解法

 

问题:
在一条街上 有5座房子 喷了5种颜色
每个房里住着不同国籍的人
每个人喝不同的饮料
       抽不同的香烟
        养不同的宠物
请问,谁养鱼?
提示:
A. 英国人住红色房子
B. 瑞典人养狗
C. 丹麦人喝茶
D. 绿色房子在白色房子左面
E. 绿色房子主人喝咖啡
F. 抽 Pall Mall 香烟的人养鸟
G. 黄色房子主人抽 Dunhill 香烟
H. 住在中间房子的人喝牛奶
I. 挪威人住第一间房
J. 抽 Blends 香烟的人住在养猫的人隔壁
K. 养马的人住抽 Dunhill 香烟的人隔壁
L. 抽 Blue Master 的人喝啤酒
M. 德国人抽 Prince 香烟
N. 挪威人住蓝色房子隔壁
O. 抽 Blends 香烟的人有一个喝水的邻居

--建立临时表
declare @t table(序号 int,房子 varchar(20),国籍 varchar(20),饮料 varchar(20),香烟 varchar(20),宠物 varchar(20))

--全部组合
insert @t select * from 
(
select 1          序号 union select 2         union select 3        union select 4            union select 5       ) n,
(
select \'红色\'      房子 union select \'绿色\'    union select \'白色\'   union select \'黄色\'        union select \'蓝色\'  ) c,
(
select \'英国\'      国籍 union select \'瑞典\'    union select \'丹麦\'   union select \'挪威\'        union select \'德国\'  ) g,
(
select \'\'        饮料 union select \'咖啡\'    union select \'牛奶\'   union select \'啤酒\'        union select \'\'    ) d,
(
select \'Pall Mall\' 香烟 union select \'Dunhill\' union select \'Blends\' union select \'Blue Master\' union select \'Prince\') s,
(
select \'\'        宠物 union select \'\'      union select \'\'     union select \'\'          union select \'\'    ) a

--按条件删除
delete @t where 国籍=\'英国\'        and 房子<>\'红色\' or 国籍<>\'英国\'        and 房子=\'红色\'                        -- A
delete @t where 国籍=\'瑞典\'        and 宠物<>\'\'   or 国籍<>\'瑞典\'        and 宠物=\'\'                          -- B
delete @t where 国籍=\'丹麦\'        and 饮料<>\'\'   or 国籍<>\'丹麦\'        and 饮料=\'\'                          -- C
delete @t where 房子=\'绿色\'        and 饮料<>\'咖啡\' or 房子<>\'绿色\'        and 饮料=\'咖啡\'                        -- E
delete @t where 香烟=\'Pall Mall\'   and 宠物<>\'\'   or 香烟<>\'Pall Mall\'   and 宠物=\'\'                          -- F
delete @t where 香烟=\'Dunhill\'     and 房子<>\'黄色\' or 香烟<>\'Dunhill\'     and 房子=\'黄色\'                        -- G
delete @t where 序号=3             and 饮料<>\'牛奶\' or 序号<>3             and 饮料=\'牛奶\'                        -- H
delete @t where 序号=1             and 国籍<>\'挪威\' or 序号<>1             and 国籍=\'挪威\'                        -- I
delete @t where 香烟=\'Blue Master\' and 饮料<>\'啤酒\' or 香烟<>\'Blue Master\' and 饮料=\'啤酒\'                        -- L
delete @t where 香烟=\'Prince\'      and 国籍<>\'德国\' or 香烟<>\'Prince\'      and 国籍=\'德国\'                        -- M
delete @t where 序号=2             and 房子<>\'蓝色\' or 序号<>2             and 房子=\'蓝色\'                        -- N & I

--筛选
select * from @t a,@t b,@t c,@t d,@t e
where a.序号=1 and b.序号=2 and c.序号=3 and d.序号=4 and e.序号=5
and a.国籍<>b.国籍 and a.香烟<>b.香烟 and a.饮料<>b.饮料 and a.房子<>b.房子 and a.宠物<>b.宠物
and a.国籍<>c.国籍 and a.香烟<>c.香烟 and a.饮料<>c.饮料 and a.房子<>c.房子 and a.宠物<>c.宠物
and a.国籍<>d.国籍 and a.香烟<>d.香烟 and a.饮料<>d.饮料 and a.房子<>d.房子 and a.宠物<>d.宠物
and a.国籍<>e.国籍 and a.香烟<>e.香烟 and a.饮料<>e.饮料 and a.房子<>e.房子 and a.宠物<>e.宠物
and b.国籍<>c.国籍 and b.香烟<>c.香烟 and b.饮料<>c.饮料 and b.房子<>c.房子 and b.宠物<>c.宠物
and b.国籍<>d.国籍 and b.香烟<>d.香烟 and b.饮料<>d.饮料 and b.房子<>d.房子 and b.宠物<>d.宠物
and b.国籍<>e.国籍 and b.香烟<>e.香烟 and b.饮料<>e.饮料 and b.房子<>e.房子 and b.宠物<>e.宠物
and c.国籍<>d.国籍 and c.香烟<>d.香烟 and c.饮料<>d.饮料 and c.房子<>d.房子 and c.宠物<>d.宠物
and c.国籍<>e.国籍 and c.香烟<>e.香烟 and c.饮料<>e.饮料 and c.房子<>e.房子 and c.宠物<>e.宠物
and d.国籍<>e.国籍 and d.香烟<>e.香烟 and d.饮料<>e.饮料 and d.房子<>e.房子 and d.宠物<>e.宠物
and (a.房子=\'绿色\' and b.房子=\'白色\' or b.房子=\'绿色\' and c.房子=\'白色\'                                           -- D
 or  c.房子=\'绿色\' and d.房子=\'白色\' or d.房子=\'绿色\' and e.房子=\'白色\')                                          -- D
and (b.宠物=\'\' and (a.香烟=\'Blends\'  or c.香烟=\'Blends\' ) or b.香烟=\'Blends\'  and (a.宠物=\'\' or c.宠物=\'\')  -- J
 or  c.宠物=\'\' and (b.香烟=\'Blends\'  or d.香烟=\'Blends\' ) or c.香烟=\'Blends\'  and (b.宠物=\'\' or d.宠物=\'\')  -- J
 or  d.宠物=\'\' and (c.香烟=\'Blends\'  or e.香烟=\'Blends\' ) or d.香烟=\'Blends\'  and (c.宠物=\'\' or e.宠物=\'\')) -- J
and (b.宠物=\'\' and (a.香烟=\'Dunhill\' or c.香烟=\'Dunhill\'or b.香烟=\'Dunhill\' and (a.宠物=\'\' or c.宠物=\'\')  -- K
 or  c.宠物=\'\' and (b.香烟=\'Dunhill\' or d.香烟=\'Dunhill\'or c.香烟=\'Dunhill\' and (b.宠物=\'\' or d.宠物=\'\')  -- K
 or  d.宠物=\'\' and (c.香烟=\'Dunhill\' or e.香烟=\'Dunhill\'or d.香烟=\'Dunhill\' and (c.宠物=\'\' or e.宠物=\'\')) -- K
and (b.饮料=\'\' and (a.香烟=\'Blends\'  or c.香烟=\'Blends\')  or b.香烟=\'Blends\'  and (a.饮料=\'\' or c.饮料=\'\')  -- O
 or  c.饮料=\'\' and (b.香烟=\'Blends\'  or d.香烟=\'Blends\')  or c.香烟=\'Blends\'  and (b.饮料=\'\' or d.饮料=\'\')  -- O
 or  d.饮料=\'\' and (c.香烟=\'Blends\'  or e.香烟=\'Blends\')  or d.香烟=\'Blends\'  and (c.饮料=\'\' or e.饮料=\'\')) -- O

分类:

技术点:

相关文章: