如何利用SQL进行推理

所属分类: 数据库 / mssql2008 阅读数: 175
收藏 0 赞 0 分享

数据库环境: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, 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

楼层安排如下:

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

更多精彩内容其他人还在看

mssql 监控磁盘空间告警实现方法

需要通过调用OLE 自动存储过程获取磁盘信息,而这些组件,基于服务器的安全配置,通常是禁用的,我们在存储过程通过sp_configure开启这个服务,调用服务完毕后,又通过sp_configure禁用该服务。另外,数据库服务器都位于内网,因此安全问题应该不大
收藏 0 赞 0 分享

SQL Server2008导出数据之Excel详细解析

我觉得数据库的导入和导出很有用,顺便做一下总结,以免将来有遗忘。需要的朋友可以过来参考下
收藏 0 赞 0 分享

利用JAVA实现DES加密算法

本文简单讲解DES的JAVA实现方法。需要的朋友可以过来参考下
收藏 0 赞 0 分享

SQL Server 2008怎样添加自增列实现自增序号

有的表需要添加自增列,在添加新纪录时自动添加一个序号,有两种不错的方法通过T-SQL代码、通过企业管理器在此分享给大家
收藏 0 赞 0 分享

SQLServer 2008 :error 40出现连接错误的解决方法

在与SQLServer建立连接时出现与网络相关的或特定与实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且SQL SERVER已配置允许远程链接
收藏 0 赞 0 分享

Java基本类型与包装类详细解析

存储方式及位置的不同,基本类型是直接存储变量的值保存在堆栈中能高效的存取,封装类型需要通过引用指向实例,具体的实例保存在堆中
收藏 0 赞 0 分享

SQL Server数据库管理员(DBA)的工作内容

DBA的工作目标就是确保Microsoft SQL Server 2008系统正常高效地运行。DBA的工作也是最繁忙的工作,无论是性能调整,还是灾难恢复,都离不开DBA的支持
收藏 0 赞 0 分享

如何在SQL Server 2008下轻松调试T-SQL语句和存储过程

sqlserver2008调试的要求和条件:如果在引擎所在的电脑或服务器上调试,则只需要SA或者WINDOWS用户登陆即可。如果是异地调试,则需要设置防火墙例外,增加SSMS和SQLSERVER.EXE为允许,增加135端口允许通过
收藏 0 赞 0 分享

解决SQL SERVER 2008数据库表中修改字段后不能保存

SQL SERVER 2008数据库表中修改字段后不能保存,这种情况将阻止保存要求重新创建表的更改一项的钩钩去掉就OK了
收藏 0 赞 0 分享

sqlserver多版本查看版本号

有人问我sqlserver怎么查看版本号呢?下面给大家整理了一些SQL Server版本号查看sql语句,可以查看SQL Server 2000 、2005 、2008版本号
收藏 0 赞 0 分享
查看更多