许先生认识 张、王、杨、郭、周
1.) 5位女士属于两个年龄段,3位年龄<30 ,2位年龄>30
2.) 2位是教师,3位是秘书
3.) 张、杨属于相同年龄段
4.) 郭、周属于不同年龄段
5.) 王、周职业相同
6.) 杨、郭职业不同
7.) 许先生的妻子是一位年龄大于30的教师
分析:
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中的记录都相互匹配,可以模拟所有组合的情况,进行筛选,最后得出答案。