iT邦幫忙

1

SQL新手求救,MS SQL語法的IN用法

  • 分享至 

  • xImage

先說明一下我的需求
我有一個陣列裡面存了所有要查詢的SID
然後我想在SQL中查詢包含那陣列所有值資料列
目前的SQL語法是這樣寫

SELECT DIP IP, 
    SID Sclass, 
    DVALUE Note, 
    FORMAT ([DISTIME], 'yyyy-MM-dd HH:mm:ss') as 斷線時間 
FROM tb_connectlog 
WHERE CONTIME IS NULL AND 
    LTRIM(RTRIM(SID)) IN ('WLS077','KPS061','AFR018','AFR019','DTS106','WLS078') 
ORDER BY DISTIME DESC

在IN後面的條件如果只有一兩個的時候
查詢速度非常快
但當條件一多的時候
查詢時間就會瞬間變超久
想請問各位大大有什麼建議可以改善這個問題嗎

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
尼克
iT邦大師 1 級 ‧ 2022-10-17 17:19:52
皓皓 iT邦新手 3 級 ‧ 2022-10-18 10:30:25 檢舉

感謝尼克大大,我再來研究一下SQL效能的優化

1
小山丘
iT邦新手 2 級 ‧ 2022-10-17 17:35:21

用EXISTS或JOIN

範例

皓皓 iT邦新手 3 級 ‧ 2022-10-18 10:32:21 檢舉

謝謝小山丘大大,我再來試試看這兩種方法

2
海綿寶寶
iT邦大神 1 級 ‧ 2022-10-17 19:12:24

若參考這篇裡有關 OR 的改善方法
改寫如下試試看

SELECT DIP IP, SID Sclass, DVALUE Note, FORMAT ([DISTIME], 'yyyy-MM-dd HH:mm:ss') as 斷線時間 
FROM tb_connectlog 
WHERE CONTIME IS NULL AND SID = 'WLS077'

UNION

SELECT DIP IP, SID Sclass, DVALUE Note, FORMAT ([DISTIME], 'yyyy-MM-dd HH:mm:ss') as 斷線時間 
FROM tb_connectlog 
WHERE CONTIME IS NULL AND SID = 'KPS061'

UNION

SELECT DIP IP, SID Sclass, DVALUE Note, FORMAT ([DISTIME], 'yyyy-MM-dd HH:mm:ss') as 斷線時間 
FROM tb_connectlog 
WHERE CONTIME IS NULL AND SID = 'AFR018'

UNION

SELECT DIP IP, SID Sclass, DVALUE Note, FORMAT ([DISTIME], 'yyyy-MM-dd HH:mm:ss') as 斷線時間 
FROM tb_connectlog 
WHERE CONTIME IS NULL AND SID = 'AFR019'

UNION

SELECT DIP IP, SID Sclass, DVALUE Note, FORMAT ([DISTIME], 'yyyy-MM-dd HH:mm:ss') as 斷線時間 
FROM tb_connectlog 
WHERE CONTIME IS NULL AND SID = 'DTS106'

UNION

SELECT DIP IP, SID Sclass, DVALUE Note, FORMAT ([DISTIME], 'yyyy-MM-dd HH:mm:ss') as 斷線時間 
FROM tb_connectlog 
WHERE CONTIME IS NULL AND SID = 'WLS078'

另外先做兩件事
1.UPDATE tb_connectlog SET SID=LTRIM(RTRIM(SID))(SQL 裡就不必每次呼叫)
2.SID 欄位要建索引

皓皓 iT邦新手 3 級 ‧ 2022-10-18 10:33:35 檢舉

謝謝海綿寶寶大大,建完索引好像情況就有稍微改善了

0
純真的人
iT邦大師 1 級 ‧ 2022-10-17 20:27:45

拆兩段試試@@...

declare @Tmp table(
	[SID] nvarchar(50),
	[DIP IP] nvarchar(50),
	[SID Sclass] nvarchar(50),
	[DVALUE Note] nvarchar(max),
	[DISTIME] datetime
)

insert into @Tmp
select [SID],
[DIP IP],
[SID Sclass], 
[DVALUE Note],
[DISTIME]
FROM tb_connectlog 
WHERE CONTIME IS NULL 

SELECT [DIP IP], 
[SID Sclass], 
[DVALUE Note], 
FORMAT ([DISTIME], 'yyyy-MM-dd HH:mm:ss') as 斷線時間
from @Tmp
where LTRIM(RTRIM(SID)) IN ('WLS077','KPS061','AFR018','AFR019','DTS106','WLS078') 
ORDER BY DISTIME DESC
皓皓 iT邦新手 3 級 ‧ 2022-10-18 10:34:17 檢舉

感謝純真的人大大,我等一下來試試看這個方法

1
alien663
iT邦研究生 3 級 ‧ 2022-10-19 17:12:20

提供我的解法當作參考,我會把陣列拆開來當作表格join就好

declare @sids varchar('WLS077,KPS061,AFR018,AFR019,DTS106,WLS078')

SELECT DIP IP, 
    [SID] as Sclass, 
    DVALUE Note, 
    FORMAT ([DISTIME], 'yyyy-MM-dd HH:mm:ss') as 斷線時間 
FROM tb_connectlog
    inner join string_split(@sids, ',') F on F.[value] = LTRIM(RTRIM(SID))
WHERE CONTIME IS NULL
ORDER BY DISTIME DESC

我要發表回答

立即登入回答