簡體   English   中英

如何編寫一個SQL請求,以選擇列值等於多個值之一的行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM