我有一张桌子,
Contacts:
Contact_ID (int)
ContactName (nvarchar)
我获得了一个联系人ID列表供您选择。通常,我会做
SELECT *
FROM Contacts
WHERE IN (List of contact ID)
问题是,联系人ID列表可能会变得非常大,例如50k或更多。
所以我的问题是,有没有办法处理大量的联系人ID而不必使用IN子句?
编辑:我正在使用Microsoft SQL Server。查询和联系人ID在运行时构建,并传递给要执行的sqlCommand类(c#)。答案 0 :(得分:3)
我创建一个包含单列和群集主键的表类型。
CREATE TYPE dbo.ContactId AS TABLE
(
ContactId INT NOT NULL PRIMARY KEY
);
使用表值参数将值传递给查询。
将您的查询更改为
SELECT *
FROM Contacts
WHERE contactID IN (SELECT y.contactID FROM @yourtablevaluedparameter y)
OPTION (RECOMPILE)
OPTION (RECOMPILE)
用于获取考虑的行数,因为50K的最佳计划可能与1不同。
答案 1 :(得分:0)
如果你想要表现,我会使用EXISTS条款。
SELECT c.Contact_ID, c.ContactName
FROM Contacts c
WHERE EXISTS (List of contact ID)
答案 2 :(得分:0)
创建临时表并以行的形式填充您的联系人ID。 在表和临时表之间进行内部连接,如下所示。
SELECT c.*
FROM Contacts c
join #temptable t
on c.id=t.id
如果在临时表中的Join列上引入索引,那么查询将更快。