SQL,试图摆脱大的IN cluase

时间:2015-08-28 13:02:31

标签: sql sql-server sql-in

我有一张桌子,

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#)。

3 个答案:

答案 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不同。

You can find some example C# code for populating a TVP here

答案 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列上引入索引,那么查询将更快。