sql 多條件組合查詢,并根據(jù)指定類別找出所有最小子類別的SQL語句備忘
DECLARE @PAGESIZE INT
DECLARE @PAGEINDEX INT
DECLARE @PAGECOUNT INT
DECLARE @RECORDCOUNT INT
SELECT @PAGESIZE=5
SELECT @PAGEINDEX=1
DECLARE @FIELDNAME VARCHAR(50)
DECLARE @FIELDVALUE VARCHAR(50)
DECLARE @OPERATION VARCHAR(50)
--組合條件
DECLARE @WHERE NVARCHAR(1000)
SELECT @WHERE=' WHERE NOTDISPLAY=0 '
DECLARE ABC CURSOR FOR
SELECT FIELDNAME,FIELDVALUE,OPERATION FROM TBPARAMETERS
OPEN ABC
FETCH NEXT FROM ABC INTO @FIELDNAME,@FIELDVALUE,@OPERATION
WHILE @@FETCH_STATUS=0
BEGIN
IF(@OPERATION = 'Like')
SELECT @WHERE=@WHERE + ' AND ' + @FIELDNAME + ' Like ''%'+@FIELDVALUE+'%'''
ELSE
BEGIN
IF(@FIELDNAME='CLASSID')
BEGIN
DECLARE @ROOTID INT
SELECT @ROOTID=@FIELDVALUE
--將指定類別的值的子類加入臨時(shí)表
INSERT INTO TBTEMCLASS(ID) SELECT ID FROM TBSDINFOCLASS WHERE ROOTID=@ROOTID
--使用游標(biāo)來將指定類別的最小類別提出放入臨時(shí)表
DECLARE CLASSID CURSOR FOR
SELECT ID FROM TBTEMCLASS
OPEN CLASSID
FETCH NEXT FROM CLASSID INTO @ROOTID
WHILE @@FETCH_STATUS=0
BEGIN
--如果判斷有子類則將子類加入臨時(shí)表,并刪除該類別,以使游標(biāo)在臨時(shí)表中循環(huán)
IF(EXISTS(SELECT ID FROM TBSDINFOCLASS WHERE ROOTID=@ROOTID))
BEGIN
INSERT INTO TBTEMCLASS(ID) SELECT ID FROM TBSDINFOCLASS WHERE ROOTID=@ROOTID
DELETE FROM TBTEMCLASS WHERE ID=@ROOTID
END
FETCH NEXT FROM CLASSID INTO @ROOTID
END
CLOSE CLASSID
DEALLOCATE CLASSID
--將自身加入臨時(shí)表
INSERT INTO TBTEMCLASS(ID) SELECT @FIELDVALUE
SELECT @WHERE=@WHERE +' AND CLASSID IN(SELECT ID FROM TBTEMCLASS)'
END
ELSE
SELECT @WHERE=@WHERE + ' AND ' + @FIELDNAME + @OPERATION+@FIELDVALUE
END
FETCH NEXT FROM ABC INTO @FIELDNAME,@FIELDVALUE,@OPERATION
END
CLOSE ABC
DEALLOCATE ABC
TRUNCATE TABLE TBPARAMETERS
-- --計(jì)數(shù)語句
DECLARE @COUNTSQL NVARCHAR(500)
SELECT @COUNTSQL=N'SELECT @RECORDCOUNT=COUNT(*) FROM TBSDINFO INNER JOIN TBUSER ON TBSDINFO.USERNAME=TBUSER.USERNAME '
SELECT @COUNTSQL=@COUNTSQL+@WHERE
--
-- --執(zhí)行統(tǒng)計(jì)
EXEC sp_executesql @COUNTSQL,
N'@RECORDCOUNT INT OUT',
@RECORDCOUNT OUT
--
-- --計(jì)算頁數(shù)
SET @PageCount = CEILING(@RecordCount * 1.0 / @PageSize)
--
-- --查詢語句
DECLARE @SQL NVARCHAR(2000)
DECLARE @ORDERBY VARCHAR(100)
SELECT @ORDERBY=' ORDER BY TBSDINFO.IsCommon DESC,TBSDINFO.CommonTime DESC,TBSDINFO.CreateTime DESC'
IF(@PAGEINDEX=1)
BEGIN
SELECT @SQL='INSERT INTO TBTEMINFO(ID,TITLE,REMARK,CREATETIME,ENDTIME,WEBDOMAIN,CLASSID,CLASSNAME,TYPEID,TYPENAME,PROVINCEID,PROVINCE,CITYID,CITY,COMPANYNAME,ADDRESS,USERTYPE) '
SELECT @SQL=@SQL+'SELECT TOP '+CONVERT(VARCHAR(4),@PAGESIZE)+' TBSDINFO.ID,TITLE,Remark,TBSDINFO.Createtime,EndTime, WebDomain,TBSDINFO.CLASSID,(SELECT CLASSNAME FROM TBSDINFOCLASS WHERE TBSDINFOCLASS.ID=TBSDINFO.CLASSID) AS CLASSNAME,TYPEID,(SELECT TYPENAME FROM TBSDINFOTYPE WHERE TBSDINFO.TYPEID=TBSDINFOTYPE.ID) AS TYPENAME,ProvinceID,(SELECT PROVINCE FROM TBPROVINCE WHERE TBPROVINCE.ID=PROVINCEID) AS PROVINCE,CityID,(SELECT CITY FROM TBCITY WHERE TBCITY.ID=CITYID) AS CITY,CompanyName,TBSDINFO.Address,UserType FROM TBSDINFO INNER JOIN TBUSER ON TBUSER.USERNAME=TBSDINFO.USERNAME'
SELECT @SQL=@SQL+@WHERE
SELECT @SQL=@SQL+@ORDERBY
END
ELSE
BEGIN
DECLARE @MINRECORD INT
SELECT @MINRECORD=(@PAGEINDEX-1)*@PAGESIZE
SELECT @SQL='INSERT INTO TBTEMINFO(ID,TITLE,REMARK,CREATETIME,ENDTIME,WEBDOMAIN,CLASSID,CLASSNAME,TYPEID,TYPENAME,PROVINCEID,PROVINCE,CITYID,CITY,COMPANYNAME,ADDRESS,USERTYPE) '
SELECT @SQL=@SQL+'SELECT TOP '+CONVERT(VARCHAR(4),@PAGESIZE)+' TBSDINFO.ID, TITLE,Remark,TBSDINFO.Createtime,EndTime, WebDomain,TBSDINFO.CLASSID,(SELECT CLASSNAME FROM TBSDINFOCLASS WHERE TBSDINFOCLASS.ID=TBSDINFO.CLASSID) AS CLASSNAME,TYPEID,(SELECT TYPENAME FROM TBSDINFOTYPE WHERE TBSDINFO.TYPEID=TBSDINFOTYPE.ID) AS TYPENAME,ProvinceID,(SELECT PROVINCE FROM TBPROVINCE WHERE TBPROVINCE.ID=PROVINCEID) AS PROVINCE,CityID,(SELECT CITY FROM TBCITY WHERE TBCITY.ID=CITYID) AS CITY,CompanyName,TBSDINFO.Address,UserType FROM TBSDINFO INNER JOIN TBUSER ON TBUSER.USERNAME=TBSDINFO.USERNAME'
IF(@WHERE<>'')
SELECT @SQL=@SQL+@WHERE+' AND '
ELSE
SELECT @SQL=@SQL+' WHERE '
SELECT @SQL=@SQL+' TBSDINFO.ID NOT IN(SELECT TOP '+CONVERT(VARCHAR(4),@MINRECORD)+' TBSDINFO.ID FROM TBSDINFO INNER JOIN TBUSER ON TBUSER.USERNAME=TBSDINFO.USERNAME '+@WHERE+@ORDERBY+')'
SELECT @SQL=@SQL+@ORDERBY
END
--PRINT @SQL
--執(zhí)行查詢
--查詢的結(jié)果是將找到的記錄放入臨時(shí)表,再通過以下游標(biāo)查詢出相應(yīng)的父類與根類記錄
EXEC (@SQL)
DECLARE @CLASSID INT
DECLARE @ID INT
DECLARE TEM CURSOR FOR
SELECT ID,CLASSID FROM TBTEMINFO
OPEN TEM
FETCH NEXT FROM TEM INTO @ID,@CLASSID
WHILE @@FETCH_STATUS=0
BEGIN
DECLARE @NS VARCHAR(500)
DECLARE @DS VARCHAR(200)
SELECT @NS=''
SELECT @DS=''
DECLARE @TEMROOTID INT
DECLARE @TEMTS VARCHAR(50)
SELECT @CLASSID=ID,@TEMTS=CLASSNAME,@TEMROOTID=ROOTID FROM TBSDINFOCLASS WHERE ID=@CLASSID
SELECT @NS=@TEMTS+'#'+@NS
SELECT @DS=CONVERT(VARCHAR(10),@CLASSID)+'#'+@DS
WHILE(@TEMROOTID>0)
BEGIN
SELECT @TEMROOTID=ROOTID,@CLASSID=ID,@TEMTS=CLASSNAME FROM TBSDINFOCLASS WHERE ID=@TEMROOTID
SELECT @NS=@TEMTS+'#'+@NS
SELECT @DS=CONVERT(VARCHAR(10),@CLASSID)+'#'+@DS
END
UPDATE TBTEMINFO SET NS=@NS,DS=@DS WHERE ID=@ID
FETCH NEXT FROM TEM INTO @ID,@CLASSID
END
CLOSE TEM
DEALLOCATE TEM
SELECT * FROM TBTEMINFO
TRUNCATE TABLE TBTEMINFO
TRUNCATE TABLE TBTEMCLASS
相關(guān)文章
SQL Server實(shí)現(xiàn)自動(dòng)循環(huán)歸檔分區(qū)數(shù)據(jù)腳本詳解
最近在工作中遇到了關(guān)于sql server的一個(gè)問題,通過查找相關(guān)的資料終于解決了,所以下面這篇文章主要給大家介紹了關(guān)于SQL Server如何實(shí)現(xiàn)自動(dòng)循環(huán)歸檔分區(qū)數(shù)據(jù)腳本的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09
SQL Server利用sp_spaceused如何查看表記錄存在不準(zhǔn)確的情況
這篇文章主要給大家介紹了關(guān)于SQL Server利用sp_spaceused如何查看表記錄存在不準(zhǔn)確情況的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SQL Server具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
SQL Server 2008 清空刪除日志文件(瞬間縮小日志到幾M)
sql 在使用中每次查詢都會(huì)生成日志,但是如果你長久不去清理,可能整個(gè)硬都堆滿哦,筆者就遇到這樣的情況,直接網(wǎng)站后臺(tái)都進(jìn)不去了。下面我們一起來學(xué)習(xí)一下如何清理這個(gè)日志吧2018-10-10
SQL Agent服務(wù)無法啟動(dòng)的解決方法
SQL Agent服務(wù)無法啟動(dòng)怎么辦?這篇文章主要介紹了SQL Agent服務(wù)無法啟動(dòng)的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
SQL Server數(shù)據(jù)庫安裝時(shí)常見問題解決方案集錦
對(duì)于初學(xué)者來說,安裝SQL Server數(shù)據(jù)庫時(shí),常常會(huì)有一些問題的出現(xiàn),這篇文章就是針對(duì)安裝時(shí)常見問題總結(jié)的解決方案,需要的朋友可以參考下2015-08-08
一個(gè)統(tǒng)計(jì)表每天的新增行數(shù)及新增存儲(chǔ)空間的功能
這篇文章主要介紹了一個(gè)統(tǒng)計(jì)表每天的新增行數(shù)及新增存儲(chǔ)空間的功能,需要的朋友可以參考下2014-07-07
SQL Server基礎(chǔ)之行數(shù)據(jù)轉(zhuǎn)換為列數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于SQL Server基礎(chǔ)之行數(shù)據(jù)轉(zhuǎn)換為列數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SQL Server具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
sqlserver數(shù)據(jù)庫主鍵的生成方式小結(jié)(sqlserver,mysql)
嚴(yán)格講這三種產(chǎn)生方式有一定的交叉點(diǎn),其定位方式將在下面進(jìn)行講解2012-07-07
啟動(dòng)sqlserver服務(wù)的bat腳本分享
這篇文章主要介紹了啟動(dòng)sqlserver服務(wù)的bat腳本分享,本文直接給出腳本代碼,需要的朋友可以參考下2015-02-02

