数据库环境: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. 【转】Eclipse 中设置JVM 内存 -- 不错

    原文网址:http://www.xuebuyuan.com/569653.html java.lang.OutOfMemoryError: Java heap space 从上边的异常信息可以看到,J ...

  2. (转载)Linux一句话精彩

    (转载)http://bjsfly.blog.163.com/blog/static/161276642007845228371/ 0001[url=111]111[/url] [ 本帖最后由 bjc ...

  3. [辅助类]NHibernateHelper

    对于学习ORM的人来说,NHibernate简直就是福音啊,而且此中技术是相当成熟,在这里分享一个小东西 public class NHibernateHelper { //数据库连接字符串 publ ...

  4. Boost库

    2014-08-31 Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成 ...

  5. Bzoj 2453: 维护队列 && Bzoj 2120: 数颜色 分块,bitset

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 578  Solved: 247[Submit][Status][Discuss] ...

  6. C#如何将线程中的代码抛到主线程去执行

    private SynchronizationContext mainThreadSynContext; //主线程 mainThreadSynContext = new WindowsFormsSy ...

  7. onethink加密解密函数

    onethink中封装的加密解密函数 <?php /** * 系统加密方法 * @param string $data 要加密的字符串 * @param string $key 加密密钥 * @ ...

  8. .NET DataTable转化为json格式

    标准的json用“分隔,不用' public static string DataSetToJson(DataTable dt) {        string json = string.Empty ...

  9. 从零开始学android开发-创建第一个android项目

    打开ADT开发工具

  10. adt-bundle-linux-x86_64-20131030下新建project提示找不到adb和R.java问题的解决

    adt-bundle-linux-x86_64-20131030下新建project提示找不到adb和R.java问题的解决 在ubuntu14.04下,搭建Android开发环境,下载官方的adt- ...