• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    如何利用SQL进行推理

    发布者: Error | 发布时间: 2025-6-18 12:42| 查看数: 25| 评论数: 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
    1. CREATE TABLE ttb
    2. (
    3.   subname VARCHAR(1) ,
    4.   realname VARCHAR(10)
    5. )
    6. INSERT INTO ttb
    7. VALUES ( 'A', 'Baker' ),
    8.   ( 'B', 'Cooper' ),
    9.   ( 'C', 'Fletcher' ),
    10.   ( 'D', 'Miller' ),
    11.   ( 'E', 'Smith' )
    复制代码
    2.生成所有可能情况的排列组合
    --生成A、B、C、D、E所有的排列组合
    1. WITH x0
    2.    AS ( SELECT CONVERT(VARCHAR(10), 'A') AS hid
    3.     UNION ALL
    4.     SELECT CONVERT(VARCHAR(10), 'B') AS hid
    5.     UNION ALL
    6.     SELECT CONVERT(VARCHAR(10), 'C') AS hid
    7.     UNION ALL
    8.     SELECT CONVERT(VARCHAR(10), 'D') AS hid
    9.     UNION ALL
    10.     SELECT CONVERT(VARCHAR(10), 'E') AS hid
    11.     ),
    12.   x1
    13.    AS ( SELECT hid
    14.     FROM  x0
    15.     WHERE LEN(hid) <= 5
    16.     UNION ALL
    17.     SELECT CONVERT(VARCHAR(10), a.hid + b.hid) AS hid
    18.     FROM  x0 a
    19.       INNER JOIN x1 b ON CHARINDEX(a.hid, b.hid, 1) = 0
    20.     )
    21. SELECT hid AS name
    22. INTO #tt
    23. FROM x1
    24. WHERE LEN(hid) = 5
    25. ORDER BY hid
    复制代码
    3.加入条件,找出满足要求的楼层安排
    1. WITH x2
    2.    AS ( SELECT name
    3.     FROM  #tt
    4.     WHERE SUBSTRING(name, 5, 1) <> 'A'--Baker 不住顶层
    5.       AND SUBSTRING(name, 1, 1) <> 'B'--Cooper不住底层
    6.       AND ( SUBSTRING(name, 1, 1) <> 'C'
    7.         AND SUBSTRING(name, 5, 1) <> 'C'--Fletcher 既不住顶层也不住底层
    8.        )
    9.       AND name LIKE '%B%D%'--Miller住得比Cooper高
    10.       AND name NOT LIKE '%CE%' AND name NOT LIKE '%EC%' --Smith住的楼层和Fletcher不相邻
    11.       AND name NOT LIKE '%BC%' AND name NOT LIKE '%CB%' --Fletcher住的楼层和Cooper不相邻
    12.     ),
    13.   x3--生成楼层号
    14.    AS ( SELECT number AS id ,
    15.       SUBSTRING(x2.name, number, 1) AS name
    16.     FROM  master.dbo.spt_values
    17.       INNER JOIN x2 ON 1 = 1
    18.     WHERE type = 'P'
    19.       AND number <= 5
    20.       AND number >= 1
    21.     )
    22. SELECT a.id AS 楼层,
    23.    b.realname AS 姓名
    24. FROM x3 a
    25.    INNER JOIN ttb b ON b.subname = a.name
    26. ORDER BY id
    复制代码
    楼层安排如下:


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

    来源:https://www.jb51.net/article/69737.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表