2

我有一张桌子,

Contacts: Contact_ID (int) ContactName (nvarchar)

我得到了一个可供选择的联系人 ID 列表。通常,我会做

SELECT *
FROM Contacts
WHERE IN (List of contact ID)

问题是,联系人 ID 列表可能会变得非常大,例如 50k 或更多。

所以我的问题是,有没有一种方法可以处理大量联系人 ID 而无需使用 IN 子句?

编辑:我正在使用 Microsoft sql 服务器。查询和联系人 ID 在运行时构建并传递给 sqlCommand 类 (c#) 以执行。

4

3 回答 3

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 的不同。

您可以在此处找到一些用于填充 TVP 的示例 C# 代码

于 2015-08-28T13:22:36.407 回答
0

如果你想要性能,我会使用 EXISTS 子句。

SELECT c.Contact_ID, c.ContactName
FROM Contacts c
WHERE EXISTS (List of contact ID)
于 2015-08-28T13:21:37.623 回答
0

创建一个临时表并以行的形式填充您的联系人 ID。在您的表和临时表之间进行内部连接,如下所示。

SELECT c.*
FROM Contacts c
join #temptable t
on c.id=t.id

如果您在临时表中的 Join 列上引入索引,那么您的查询会更快。

于 2015-08-28T14:09:02.657 回答