sql 多條件組合查詢,并根據(jù)指定類(lèi)別找出所有最小子類(lèi)別的SQL語(yǔ)句備忘
更新時(shí)間:2009年06月13日 19:55:29 作者:
多條件組合查詢,并根據(jù)指定類(lèi)別找出所有最小子類(lèi)別的SQL語(yǔ)句備忘
復(fù)制代碼 代碼如下:
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
--將指定類(lèi)別的值的子類(lèi)加入臨時(shí)表
INSERT INTO TBTEMCLASS(ID) SELECT ID FROM TBSDINFOCLASS WHERE ROOTID=@ROOTID
--使用游標(biāo)來(lái)將指定類(lèi)別的最小類(lèi)別提出放入臨時(shí)表
DECLARE CLASSID CURSOR FOR
SELECT ID FROM TBTEMCLASS
OPEN CLASSID
FETCH NEXT FROM CLASSID INTO @ROOTID
WHILE @@FETCH_STATUS=0
BEGIN
--如果判斷有子類(lèi)則將子類(lèi)加入臨時(shí)表,并刪除該類(lèi)別,以使游標(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ù)語(yǔ)句
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ì)算頁(yè)數(shù)
SET @PageCount = CEILING(@RecordCount * 1.0 / @PageSize)
--
-- --查詢語(yǔ)句
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í)表,再通過(guò)以下游標(biāo)查詢出相應(yīng)的父類(lèi)與根類(lèi)記錄
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)文章
SQLSERVER ISNULL 函數(shù)與判斷值是否為空的sql語(yǔ)句
由于服務(wù)器設(shè)置不當(dāng)導(dǎo)致sqlserver的某個(gè)字段為空,導(dǎo)致部分內(nèi)容顯示失敗,所有這里需要將為空的字符替換為制定的字符2013-11-11
SQL語(yǔ)句練習(xí)實(shí)例之四 找出促銷(xiāo)活動(dòng)中銷(xiāo)售額最高的職員
你剛在一家服裝銷(xiāo)售公司中找到了一份工作,此時(shí)經(jīng)理要求你根據(jù)數(shù)據(jù)庫(kù)中的兩張表得到促銷(xiāo)活動(dòng)銷(xiāo)售額最高的銷(xiāo)售員2011-10-10
我也有微信朋友圈了 Android實(shí)現(xiàn)
最近寫(xiě)了一個(gè)簡(jiǎn)單的朋友圈程序,包含了朋友圈的列表實(shí)現(xiàn),視頻的錄制、預(yù)覽與上傳,圖片可選擇拍照或者從相冊(cè)選取,從相冊(cè)選取可以一次選擇多張照片,并且限制照片的張數(shù),想擁有真正屬于自己的朋友圈嗎?快來(lái)圍觀2016-05-05
自增長(zhǎng)鍵列統(tǒng)計(jì)信息的處理方法
在這篇文章展示了SQL Server的查詢優(yōu)化器如何使用自增長(zhǎng)鍵列統(tǒng)計(jì)信息,大家都知道SQLServer里每個(gè)統(tǒng)計(jì)信息對(duì)象都有關(guān)聯(lián)的直方圖直方圖用多個(gè)步長(zhǎng)描述指定列數(shù)據(jù)分布情況,需要的朋友可以參考下2015-07-07
SQL?Server縱表轉(zhuǎn)橫表的實(shí)現(xiàn)示例
在使用SQL?Server數(shù)據(jù)庫(kù)的過(guò)程中我們經(jīng)常會(huì)遇到需要將查詢結(jié)果從縱表轉(zhuǎn)成橫表的問(wèn)題,本文就來(lái)介紹一下SQL?Server縱表轉(zhuǎn)橫表示例,感興趣的可以了解一下2023-12-12
數(shù)據(jù)庫(kù)SQL語(yǔ)句優(yōu)化總結(jié)(收藏)
網(wǎng)上關(guān)于SQL優(yōu)化的教程很多,但是比較雜亂。近日有空整理了一下,寫(xiě)出來(lái)跟大家分享一下,感興趣的朋友參考下2017-03-03
sql導(dǎo)入.back文件的實(shí)現(xiàn)
本文主要介紹了sql導(dǎo)入.back文件的實(shí)現(xiàn),.back文件是一種備份文件,其中包含了數(shù)據(jù)庫(kù)的結(jié)構(gòu)和數(shù)據(jù),然后通過(guò)執(zhí)行一系列的SQL命令,可以還原備份文件到數(shù)據(jù)庫(kù)中,感興趣的可以了解一下2023-11-11

