数据库环境:SQL SERVER 2008R2

有如下需求:

Baker, Cooper, Fletcher, Miller and Smith住在一座房子的不同楼层。
Baker 不住顶层。Cooper不住底层。
Fletcher 既不住顶层也不住底层。Miller住得比Cooper高。
Smith住的楼层和Fletcher不相邻。
Fletcher住的楼层和Cooper不相邻。
用SQL写出来
 
解题思路:
先实现所有人住楼层的排列组合,然后把条件套进去即求得。如何实现排列组合,
具体可以参考我前面的文章 http://www.cnblogs.com/boss-he/p/4534017.html
 
1.基础数据准备
--准备基础数据,用A、B、C、D、E分别表示Baker, Cooper, Fletcher, Miller and Smith
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所有的排列组合
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.加入条件,找出满足要求的楼层安排

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, 1) <> 'C'
AND SUBSTRING(name, 5, 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

楼层安排如下:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHMAAAB1CAIAAADyeEmsAAAFU0lEQVR4nO2dy63bMBBF2VK26iCNMH2kAvURZBVAKUYNvKW8tgFmIVIafs3f8OPMhRH46cn21XnjkcQrKuzX7z/0wHiwV1Bfj2d4hTYaxEa8vh5PIosiIoulfLKMscCP55KAMozm2Yj5FYZKyV52A098r001GvNWn0P2pSOG7hvXrG3AWK3cQ5JyyIaRxdRsntGADduVsab9hiOSPRVTs696xeK0YX+0/ebO5dhYX9lkYaVcS3xPqihMNuZD7ZVRVUQ2vD0tycZ8aDOmpzL77Cviy+78VXZD8NnwOTHWrGUjyXCF41ln8UaWUqTyavbC1+BbZajaHizw3N7aPKNhG+E3n5Lsy2q7cAW8bvCKqFnb4TTdwPAX/vYZr001GniTt9RmqtnGGsRGvIgslr4eT/b1eNID48GOd2KMDfLvRBJCvOkGx3H83UX3x+l1FsWSZYx1J8sY640rQVSzWKKaxVKVmt2+M/6zb83u66LODvgWvfX7uizrXgGjQ4U1u//4JjenAVl/zW6cKUL7ugTYnigvoCOQHbpmUwENRTbYZxuR9dfsvi5MQ7Svy8L5whhjy7qt8skOlzNVvCtPbyMVyQ5dswquAgZQwydXH4A1ewGtXb+fUbNAZ8u1v+8+shfNXmSHr1mIlm8TkR25ZrXDAarZujW7qb2QbJthsnJ1UNodydI5WKpo3ABLVLNYoprFkiQbjhyoZjMkycZkDxTVpErEdIPeFSCEmLMbENnqIrJYIrJYKiV7n1bWHd30e3UKhDUNjESpiCwYCgmHJDW9um3cp/wbHwNutW6AGXxoXnt8co5qke1Xsz6wd4NQvowlMLlxrHMlEec6yRtXh6yVQ6Eohez9l1bPrCXANFgHZMDnqGPuhlUg2warSCJrD7y+XXIO1zKoZd3yO00p2WZYRVKfzSArK1T/1hf08DKybffDKccGkd3AOLKxFvUiCzKSq+cjKu14Vo/JHUv2dVkWc517m0CWXuD2vzwHQz5aI7JY+o/JIovIYumITGt6+xRiUrI1MwqSkqBugCEiiyUiiyUii6VSshvOpegBrw5pY1Seo//m4+NlZO85LRvHZxskC4aufQPhM5G91cJ4FFnf33hWsi3CmrSaheNwelywcTjcVSmb8bktzhRG7rPm1d6uq7yLsxmf25kTRvPDVTeAuCU1fVdbNZvxuZ06FTfInkb0+aJ3EhO8RKLqNhSRHeRKDrPPMr7B/Zg928bIca6n45AVZriBq7g+C7AZ3QBOepZ+q2UzPrd0DlZfRBZLRBZLRBZLB6U1SDoorcGToG6AISKLJSKLJSKLpTpk4dgctleH9LPbhfPkk1SE8aQaZMF5OKpCZOHHZwQ2Q5KVA/FE1lAxWf1WQ6hKJquFMeoHmNnoWY55S7SyLKeQrBwG7U8WDiJKN64wxphLIzdB3oZOvyVaaZZTRBYWx3A1GwhjbLvu2SBFWU4JWfvD+6U1brKeMCaWbFGWU+eoa8SaDYUxrm5gRrqlWc4HkxVWlqRugKb9ytpR+F7ehWwbDWIjUkQWS0QWS0QWSwelNUg6KK3Bk6BugCEiiyUiiyUii6VCsvCa9b7zFOCoqR5ymEOIjVROtv/dTuTdNYx7byz6negnI9vWbtjGypWVjWvx0axkm/WCt2NdG1cjWmpU0FmzmPNpbLflM+16X00PZ884mVbKYFLdzj8DRFLj29n5fWSR59PYbj+DrNyT3SPZbrKI82lst+Vza1pcJfN+R3oZCnUDxPk0ttv559Y4E0P3URfifBrbLZ2D1ReRxRKRxRKRxdJBaQ2SDkprkHTynen/MJpLRBZL/wAMB1CQ1XAk6QAAAABJRU5ErkJggg==" alt="" />

(本文完)

利用SQL进行推理的更多相关文章

  1. 利用SQL Server 2008 R2创建自动备份计划

    本文主要利用SQL Server 2008 R2自带的"维护计划"创建一个自动备份数据的任务. 首先,启动 Sql Management studio,确保"SQL Se ...

  2. 利用SQl对数据库实行数据拆分与组合

    利用SQl对数据库实行数据拆分与组合实现提供以下几种方案: 方法一: WITH CTE AS (SELECT A.Id,A.[Uid],UserName FROM (SELECT A.[id], RE ...

  3. 利用SQL注入漏洞登录后台的实现方法

    利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读 ...

  4. 利用sql批量删除表,存储过程

    利用sql批量删除表,存储过程. 最近用godaddy的空间,由于系统里面的表多,一个个的删除很麻烦,就网上搜集了一下解决方法. 给大家分享一下: 1.批量删除存储过程 declare @procNa ...

  5. 利用 SQL Monitor 查看语句运行状态步骤

    利用 SQL Monitor 查看语句运行状态步骤 1.确定语句被 SQL Monitor 监控 SQL> SELECT * FROM GV$SQL_MONITOR WHERE sql_id=' ...

  6. ASP.net(C#)利用SQL Server实现注册和登陆功能

    说说我现在吧,楼主现在从事的事IT行业,主攻DotNet技术:当然这次上博客园我也是有备而来,所有再次奉献鄙人拙作,以飨诸位,望诸位不吝赐教. 世界上大多数的工作都是熟练性的工种,编程也不例外,做久了 ...

  7. 利用sql命令把结果集输出到文件

    利用sql命令把结果集输出到文件 红色部分的三条命令完成把结果集输出到文件!! [root@test root]# psql -hlocalhost -Utest testWelcome to psq ...

  8. 利用SQL Profiler 追踪数据库操作

    SQL Server 事件探查器 是一个界面,用于创建和管理跟踪并分析和重播跟踪结果. 这些事件保存在一个跟踪文件中,稍后试图诊断问题时,可以对该文件进行分析或用它来重播一系列特定的步骤. SQL S ...

  9. KPPW2.5 漏洞利用--SQL注入

    KPPW2.5 漏洞利用--SQL注入 SQL注入--布尔型盲注 环境搭建 1,集成环境简单方便,如wamp,phpstudy.... 2,KPPW v2.2源码一份(文末有分享)放到WWW目录下面 ...

随机推荐

  1. Unity3D与iOS消息交互方法(1)--iOS接收Unity3D发出的消息

    跨平台这种事情不管多NB, 总要有些与原生系统交互的方法, 比如  Unity3D与iOS消息交互方法. 一: 建立一个空的Unity工程. File -->  New Project 二: 编 ...

  2. 【转】Valid signing identity not found解决办法(原有IDP私钥丢失)及Certificate、App ID、Devices、Provisioning Profiles之间区别--不错

    原文网址:http://blog.csdn.net/mad1989/article/details/8699147 前言: 刚刚把mini换成了macbookair,之前一直在mini上进行开发,到换 ...

  3. structs 源码示例

    http://blog.csdn.net/wwwihpccn/article/details/5725518

  4. Kia's Calculation(HDU 4267)

    Problem Description Doctor Ghee is teaching Kia how to calculate the sum of two integers. But Kia is ...

  5. lfs遇到的一些问题--后续阶段

    1.安装GPM-1.20.7,make install出错: prog/display-buttons.c:39:57: 致命错误:gpm.h:没有那个文件或目录 #include <gpm.h ...

  6. Bzoj 1042: [HAOI2008]硬币购物 容斥原理,动态规划,背包dp

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1747  Solved: 1015[Submit][Stat ...

  7. puppet任务计划

  8. POJ 1113 Wall 凸包求周长

    Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26286   Accepted: 8760 Description ...

  9. linux内核数据结构--进程相关

    linux里面,有一个结构体task_struct,也叫“进程描述符”的数据结构,它包含了与进程相关的所有信息,它非常复杂,每一个字段都可能与一个功能相关,所以大部分细节不在我的研究范围之内,在这篇文 ...

  10. mysql按字段分组并获取每个分组按照某个字段排序的前三条

    这是原始数据 想按照brand_id分组 并获取每个分组total_num最高的前3位 SQL语句为: > (select count(*) from data where brand_id = ...