数据库:SQL Server 2008R2环境

有以下要求:

Baker、库珀、弗莱彻、Miller和史米斯住在一栋房子的不同楼层。

Baker不住在顶层,Cooper不住在底层。

弗莱彻既不顶也不底,Miller比Cooper高。

史密斯的地板不在弗莱彻附近。

弗莱彻的地板与Cooper不相邻。

用sql写出来



解决问题的想法:

首先,实现了所有楼层的布局和组合,然后得到了条件,如何实现排列组合,



1。基础数据准备

-准备基本数据,并使用A,B,C,D,E代表Baker,库珀,弗莱彻,Miller和史米斯




创建表的TTB
(
子名字varchar(1),
实名varchar(10)
)
插入TTB
价值观(A,'baker),
(B,'cooper),
(c,'fletcher),
(会的,'miller),
(e,'smith)




2。生成所有可能的排列

-生成a、b、c、d和e的所有排列和组合




X0
为(选择转换(varchar(10),A)为藏
联盟的所有
选择转换(varchar(10),B)为藏
联盟的所有
选择转换(varchar(10),C)为藏
联盟的所有
选择转换(varchar(10),就为藏)
联盟的所有
选择转换(varchar(10),e)为藏
),
X1
如(选择HID)
从x0
莱恩(隐藏)< = 5
联盟的所有
选择转换(varchar(10),a.hid + b.hid)为藏
一个从x0
内连接X1 B charindex(a.hid,b.hid,1)= 0
)
选择隐藏名
为# TT
从X1
其中莱恩(HID)= 5
为了躲


三.加入条件以找到楼层布置以满足要求。




X2
作为(选择名称)
从# TT
在子(名5, 1)<>A——Baker活顶
和子串(名称、1, 1)<> B -库珀活下去
和(子串(名字,1, 1),C
和子串(名字,5, 1)c--弗莱彻<<不活顶不住下
)
Miller的名字比Cooper高。
和名字不喜欢' % %名不喜欢CE乳油%--史米斯和弗莱彻是不相邻的住宅楼
和名字不喜欢%年%名不喜欢CB--弗莱彻和Cooper是不相邻的住宅楼
),
X3——产生的楼层数
选择编号作为id,
子串(x2.name,数,1)名称
从master.dbo.spt_values
内部连接X2为1=1
类型= 'p'
和数字< 5
和数字> 1
)
选择张楼,
b.realname姓名
从X3
内加入TTB B b.subname = a.name
订单ID


楼层安排如下:





通过以上代码的介绍,希望对大家有所帮助。