我有一个类似的查询:
SELECT *
FROM myDB.Table
WHERE KEY='a' OR
WHERE KEY='b' OR
WHERE KEY='c' OR ...
我需要在表中大约150个表行完成大约500,000。有更好/更快的方法吗?
答案 0 :(得分:9)
SELECT * FROM myDB.Table WHERE KEY IN ('a', 'b', 'c', etc...)
IN运算符允许您在WHERE子句中指定多个值。
答案 1 :(得分:2)
如果您需要在IN
语句中包含150个值,则编写用户定义的函数可能更有效,该函数将以逗号分隔的连接值列表,并将其返回为表变量,然后可以直接在查询中加入。
以下是从此网站http://www.sql-server-helper.com/functions/comma-delimited-to-table.aspx获取的示例(尽管还有很多其他网站):
CREATE FUNCTION [dbo].[ufn_CSVToTable] ( @StringInput NVARCHAR(8000) )
RETURNS @OutputTable TABLE ( [String] NVARCHAR(10) )
AS
BEGIN
DECLARE @String NVARCHAR(10)
WHILE LEN(@StringInput) > 0
BEGIN
SET @String = LEFT(@StringInput,
ISNULL(NULLIF(CHARINDEX(',', @StringInput) - 1, -1),
LEN(@StringInput)))
SET @StringInput = SUBSTRING(@StringInput,
ISNULL(NULLIF(CHARINDEX(',', @StringInput), 0),
LEN(@StringInput)) + 1, LEN(@StringInput))
INSERT INTO @OutputTable ( [String] )
VALUES ( @String )
END
RETURN
END
GO
NVARCHAR(10)
)和@String
以匹配您的密钥数据类型。然后你就像这样加入这张桌子:
SELECT MyTable.*
FROM [myDB].[Table] MyTable
INNER JOIN [myDB].[ufn_CSVToTable] ( 'a,b,c' ) KeyFilter
ON MyTable.[KEY] = KeyFilter.[String]