如何利用SQL進(jìn)行推理
數(shù)據(jù)庫(kù)環(huán)境:SQL SERVER 2008R2
有如下需求:
Baker, Cooper, Fletcher, Miller and Smith住在一座房子的不同樓層。
Baker 不住頂層。Cooper不住底層。
Fletcher 既不住頂層也不住底層。Miller住得比Cooper高。
Smith住的樓層和Fletcher不相鄰。
Fletcher住的樓層和Cooper不相鄰。
用SQL寫(xiě)出來(lái)
解題思路:
先實(shí)現(xiàn)所有人住樓層的排列組合,然后把條件套進(jìn)去即求得。如何實(shí)現(xiàn)排列組合,
1.基礎(chǔ)數(shù)據(jù)準(zhǔn)備
--準(zhǔn)備基礎(chǔ)數(shù)據(jù),用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.加入條件,找出滿(mǎn)足要求的樓層安排
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--生成樓層號(hào)
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
樓層安排如下:

通過(guò)以上的代碼的介紹,希望對(duì)大家的學(xué)習(xí)有所幫助。
相關(guān)文章
SQL Server 2008 R2 為用戶(hù)權(quán)限分配的操作步驟
這篇文章主要介紹了SQL Server 2008 R2 為用戶(hù)權(quán)限分配的操作步驟,有時(shí)候我們不得不設(shè)置一些權(quán)限,例如禁止刪除等,那么就可以參考下面的方法2017-10-10
SQL Server數(shù)據(jù)庫(kù)管理員(DBA)的工作內(nèi)容
DBA的工作目標(biāo)就是確保Microsoft SQL Server 2008系統(tǒng)正常高效地運(yùn)行。DBA的工作也是最繁忙的工作,無(wú)論是性能調(diào)整,還是災(zāi)難恢復(fù),都離不開(kāi)DBA的支持2013-10-10
SQL Server 2008 數(shù)據(jù)庫(kù)鏡像部署實(shí)例之一 數(shù)據(jù)庫(kù)準(zhǔn)備
利用Sql Server 2008 enterprise X64,建立異步(高性能)鏡像數(shù)據(jù)庫(kù),同時(shí)建立見(jiàn)證服務(wù)器實(shí)現(xiàn)自動(dòng)故障轉(zhuǎn)移2013-11-11
使用Navicat Premium將SQLServer數(shù)據(jù)導(dǎo)出為sql格式
這篇文章主要介紹了使用Navicat Premium將SQLServer數(shù)據(jù)導(dǎo)出為sql格式,需要的朋友可以參考下2016-12-12
MyEclipse 配置SQL Server 2008數(shù)據(jù)庫(kù)驅(qū)動(dòng)操作步驟
本篇文章小編為大家介紹,MyEclipse 配置SQL Server 2008數(shù)據(jù)庫(kù)驅(qū)動(dòng)操作步驟。有需要的朋友參考下2013-04-04
sql server 2008中的apply運(yùn)算符使用方法
sql server 2008中的apply運(yùn)算符使用方法,需要的朋友可以參考一下2013-05-05
通過(guò)SQL Server 2008數(shù)據(jù)庫(kù)復(fù)制實(shí)現(xiàn)數(shù)據(jù)庫(kù)同步備份
下面通過(guò)一個(gè)示例和大家一起學(xué)習(xí)一下如何部署SQL Server 2008數(shù)據(jù)庫(kù)復(fù)制2014-08-08

