Oracle SQL笛卡尔连接 求解许先生的妻子是谁?

许先生认识 张、王、杨、郭、周
1.) 5位女士属于两个年龄段,3位年龄<30 ,2位年龄>30
2.) 2位是教师,3位是秘书
3.) 张、杨属于相同年龄段
4.) 郭、周属于不同年龄段
5.) 王、周职业相同
6.) 杨、郭职业不同
7.) 许先生的妻子是一位年龄大于30的教师

问:许先生的妻子是谁?


约定:

age      1:<30     2:>30   3个1  2个2
job       1:教师    2:秘书  2个1  3个2


求解:

select decode(ot.age_zhang, '1', '小于30', '大于30') age_zhang,
       decode(ot.job_zhang, '1', '教师', '秘书') job_zhang,
       decode(ot.age_wang, '1', '小于30', '大于30') age_wang,
       decode(ot.job_wang, '1', '教师', '秘书') job_wang,
       decode(ot.age_yang, '1', '小于30', '大于30') age_yang,
       decode(ot.job_yang, '1', '教师', '秘书') job_yang,
       decode(ot.age_guo, '1', '小于30', '大于30') age_guo,
       decode(ot.job_guo, '1', '教师', '秘书') job_guo,
       decode(ot.age_zhou, '1', '小于30', '大于30') age_zhou,
       decode(ot.job_zhou, '1', '教师', '秘书') job_zhou
from (
with t as (
select 1 age,level job from dual connect by level<=2
union all
select 2 age,level job from dual connect by level<=2)
select 
t1.age age_zhang,t1.job job_zhang,
t2.age age_wang,t2.job job_wang,
t3.age age_yang,t3.job job_yang,
t4.age age_guo,t4.job job_guo,
t5.age age_zhou,t5.job job_zhou
 from t t1,t t2,t t3,t t4,t t5) ot
 where ot.age_zhang=ot.age_yang
 and ot.age_guo<>ot.age_zhou
 and ot.job_wang=ot.job_zhou
 and ot.job_yang<>ot.job_guo
 and (ot.age_zhang+ot.age_wang+ot.age_yang+ot.age_guo+ot.age_zhou)=7
 and (ot.job_zhang+ot.job_wang+ot.job_yang+ot.job_guo+ot.job_zhou)=8
 and ((ot.age_zhang=2 and ot.job_zhang=1) or (ot.age_wang=2 and ot.job_wang=1) or (ot.age_yang=2 and ot.job_yang=1) or (ot.age_guo=2 and ot.job_guo=1) or  (ot.age_zhou=2 and ot.job_zhou=1));

AGE_ZHANG    JOB_ZHANG    AGE_WANG    JOB_WANG    AGE_YANG    JOB_YANG    AGE_GUO    JOB_GUO    AGE_ZHOU    JOB_ZHOU
小于30       教师         大于30      秘书        小于30      秘书        大于30     教师       小于30      秘书

 

分析:

每个人有2个属性,年龄和工作,其中又分别有2个年龄段和2中工作。意味着每个人可能有4中组合。

用笛卡尔连接构造5个人,一共是1024种组合。

通过给定条件筛选,最终得出答案,只有一条情况符合条件。


总结:

笛卡尔连接得实际意义就是结果集1中的所有记录和结果集2中的记录都相互匹配,可以模拟所有组合的情况,进行筛选,最后得出答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值