SQL,试图去掉大的 IN 子句

SQL, trying to get rid of large IN cluase

我有一个table,

Contacts: Contact_ID (int) ContactName (nvarchar)

我收到了 select 的联系人 ID 列表。通常,我会做

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

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

所以我的问题是,有没有一种方法可以在不使用 IN 子句的情况下处理大量联系人 ID?

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

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

SELECT c.Contact_ID, c.ContactName
FROM Contacts c
WHERE EXISTS (List of contact ID)

我会创建一个 table 类型,其中包含一个列和一个聚集主键。

CREATE TYPE dbo.ContactId AS TABLE
(
    ContactId INT NOT NULL PRIMARY KEY 
);

使用 table 值参数将值传递到查询中。

将您的查询更改为

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

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

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

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