加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

如何借助SQL进行推理

发布时间:2023-07-28 15:09:19 所属栏目:MsSql教程 来源:
导读:数据库环境:sql SERVER 2008R2

有如下需求:

Baker,Cooper,Fletcher,Miller and Smith住在一座房子的不同楼层。

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

Fletcher 既不住顶层也不住底层。Miller住得比Co
数据库环境:sql SERVER 2008R2
 
有如下需求:
 
Baker,Cooper,Fletcher,Miller and Smith住在一座房子的不同楼层。
 
Baker 不住顶层。Cooper不住底层。
 
Fletcher 既不住顶层也不住底层。Miller住得比Cooper高。
 
Smith住的楼层和Fletcher不相邻。
 
Fletcher住的楼层和Cooper不相邻。
 
用sql写出来
 
解题思路:
 
先实现所有人住楼层的排列组合,然后把条件套进去即求得。如何实现排列组合,
 
1.基础数据准备
 
--准备基础数据,用A、B、C、D、E分别表示Baker,Miller and Smith
 
<div class="jb51code">
 
<pre class="brush:sql;">
 
CREATE TABLE ttb
 
(
 
subname VARCHAR(1),realname VARCHAR(10)
 
)
 
INSERT INTO ttb
 
VALUES ( 'A','Baker' ),( 'B','Cooper' ),( 'C','Fletcher' ),( 'D','Miller' ),( 'E','Smith' )
 
2.生成所有可能情况的排列组合
 
--生成A、B、C、D、E所有的排列组合
 
<div class="jb51code">
 
<pre class="brush:sql;">
 
WITH x0
 
AS ( SELECT CONVERT(VARCHAR(10),'A') AS hid
 
UNION ALL
 
SELECT CONVERT(VARCHAR(10),'B') AS hid
 
UNION ALL
 
SELECT CONVERT(VARCHAR(10),'C') AS hid
 
UNION ALL
 
SELECT CONVERT(VARCHAR(10),'D') AS hid
 
UNION ALL
 
SELECT CONVERT(VARCHAR(10),'E') AS hid
 
),x1
 
AS ( SELECT hid
 
FROM x0
 
WHERE LEN(hid) <= 5
 
UNION ALL
 
SELECT CONVERT(VARCHAR(10),a.hid + b.hid) AS hid
 
FROM x0 a
 
INNER JOIN x1 b ON CHARINDEX(a.hid,b.hid,1) = 0
 
)
 
SELECT hid AS name
 
INTO #tt
 
FROM x1
 
WHERE LEN(hid) = 5
 
ORDER BY hid
 
3.加入条件,找出满足要求的楼层安排
 
<div class="jb51code">
 
<pre class="brush:sql;">
 
WITH x2
 
AS ( SELECT name
 
FROM #tt
 
WHERE SUBSTRING(name,5,1) <> 'A'--Baker 不住顶层
 
AND SUBSTRING(name,1,1) <> 'B'--Cooper不住底层
 
AND ( SUBSTRING(name,1) <> 'C'
 
AND SUBSTRING(name,1) <> 'C'--Fletcher 既不住顶层也不住底层
 
)
 
AND name LIKE '%B%D%'--Miller住得比Cooper高
 
AND name NOT LIKE '%CE%' AND name NOT LIKE '%EC%' --Smith住的楼层和Fletcher不相邻
 
AND name NOT LIKE '%BC%' AND name NOT LIKE '%CB%' --Fletcher住的楼层和Cooper不相邻
 
),x3--生成楼层号
 
AS ( SELECT number AS id,SUBSTRING(x2.name,number,1) AS name
 
FROM master.dbo.spt_values
 
INNER JOIN x2 ON 1 = 1
 
WHERE type = 'P'
 
AND number <= 5
 
AND number >= 1
 
)
 
SELECT a.id AS 楼层,b.realname AS 姓名
 
FROM x3 a
 
INNER JOIN ttb b ON b.subname = a.name
 
ORDER BY id
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章