どのようにSQLを利用して推理しますか?

2928 ワード

データベース環境:SQL SERVER 2008 R 2
次のような需要があります
Baker、Cooper、Flettecher、Miller and Smithは一つの家の違う階に住んでいます。
Bakerは最上階に住めない。Cooperは底辺に住めない。
Flettecherは最上階にも底にも住まない。MillerはCooperより高く住んでいます。
Smithが住んでいる階とFlettecherは隣接していません。
Flettecherが住んでいる階とCooperは隣接していません。
SQLで書く
 
問題解決の考え方:
まず、すべての人が住んでいる階の並べ替えを実現して、条件を入れて求めます。どのように並べ替えを実現しますか?
 
1.基礎データ準備
--ベースデータを用意し、A、B、C、D、EでそれぞれBaker、Cooper、Flettecher、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
フロアの手配は以下の通りです。

以上のコードの紹介を通して、皆さんの勉強に役に立ちたいです。