[英]How to write a SQL request that selects rows with a column value equal to one of multiple values?
我有一個帶有表的SQL Azure數據庫,該表具有JobId
主鍵。 用戶將一堆“工作ID”作為一個數組發送,該數組可以包含一個或多個(也許十個,也許一萬個)值。 我不能決定如何為此編寫SQL查詢。 我將使用.NET Framework類。
我看到的一個選項是創建一個臨時表並在WHERE IN
嵌套SELECT
(類似於SQL + C#的偽代碼)中進行操作:
CREATE TEMP TABLE JobIdsTable
foreach( JobId in JobIdsFromClients ) {
INSERT INTO JobIdsTable VALUES (JobId)
}
SELECT * FROM JobsTable WHERE JobId IN SELECT * FROM JobIdsTable
從代碼編寫的角度來看,這里看起來很酷,但是我不確定它是否會一直運行得很快。
另一個選擇是創建一個巨大的OR
級聯,形成一個巨大的SELECT
:
SELECT * FROM JobsTable WHERE JobId='JobId1' OR JobId='JobId2' OR JobId='JobId3' .....
這里是一個SELECT
但是連接這個longs字符串的想法聽起來不太好(通常我會使用System.Data.SqlClient.SqlCommand.Parameters
來構建參數化查詢,但是這將非常復雜。不確定SQL查詢的持續時間是否有限制。
我希望查詢既易於管理又性能出色。 因此,我看到了這兩種選擇的弊端。
我該選擇哪一個? 我會以其他方式代替嗎?
我會去臨時表,但使用聯接而不是子查詢。 如果Id列已建立索引,則性能應該不錯:
SELECT *
FROM JobsTable j
INNER JOIN JobIdsTable jt ON j.JobId = jt.JobId
jobId來自何處,我無法想象ID來自用戶輸入10,000個整數的形式。
理想情況下,您需要的是某種“ JobBatch”表,該表將ID組合在一起,可以通過作業表上的JobBatchId FK或中間的JobBatchId表(如果有很多的話,可以將作業批量實現為作業)。 然后,無論生成ID的是什么,都只需要生成一個“批”即可,而您只需要傳遞一個ID。
對於此問題,有一些解決方法,將逗號分隔的列表作為單個參數傳遞,然后在SP中將其拆分出來,但由於設計不正確,最多有10,000個。 這里是如果你要沿着這條路走下去的分裂功能的集合。
您可以連接一長串ID(而不是OR),並使用WHERE IN子句,例如:
SELECT * FROM JobsTable WHERE JobId IN (12343,454353,24354,20200/*,...so on...*/)
通過SQL Server可以快速構建和輕量級管理
如果您希望使用IN (3939)
,則IN語法只能接受一個值;如果您希望采用骯臟的解決方案不檢查Cero基數,則可以開始使用(0
並添加所需的','+IDvalue
和一個final )
(前提是0不是有效的JobId)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.