SQL IN 逗号分隔参数与内部查询

Posted

技术标签:

【中文标题】SQL IN 逗号分隔参数与内部查询【英文标题】:SQL IN comma separated parameters vs inner query 【发布时间】:2012-07-24 06:26:14 【问题描述】:

我知道 SQL IN 子句中有 1000 个项目的限制。 目前,我在选择查询的“IN”子句中使用逗号分隔的项目字符串,我想更改它。

所以,我找到了this,它声明使用JOIN 或在IN 本身内部传递查询。

应该首选哪一个?

编辑(另一个问题):

在“IN”子句中传递查询和在“IN”子句中传递逗号分隔参数有什么区别?

【问题讨论】:

数据库优化器将以相同的方式执行这两个变体。您可以使用看起来更好的那个。 :) 实际上是否在in 子句中使用包含 1,000 个逗号分隔项的查询? 0_0 Srsly,将它们放在一个表中并适当地加入。 @JackManey:不是现在,但将来有机会。 @HardikMishra - 在这种情况下,将它们放在一个表中并适当地加入(或使用in 语句,例如column in (select column from table_with_tons_of_values_oh_god_dont_want_to_list_them_all))。 @Andomar:请粘贴您的评论作为答案。我发现它很有帮助 【参考方案1】:

数据库优化器将以相同的方式执行这两种变体。您可以使用看起来更好的那个。 :)

【讨论】:

【参考方案2】:

当您将查询放在“In 子句”中时,数据库需要首先计算此查询,然后根据结果计算“主查询”。 如果您将值放在“In 子句”中,则数据库需要计算附加查询。

考虑到在 in 子句中加入查询,数据库会将它们优化为相同。

【讨论】:

所以,你的意思是把值放在比查询好? 从明确的性能角度来看,放置值更快,因为它不需要执行额外的查询,但性能并不是唯一的观点。如果差异是 1 毫秒,而 1 毫秒对您来说可以忽略不计,那么请采取清除方法。 当你的值较少但值超过 1k 时是这样,那么 SQL 本身对 IN 子句有限制。所以,这不是我想要的解决方案。

以上是关于SQL IN 逗号分隔参数与内部查询的主要内容,如果未能解决你的问题,请参考以下文章

PL SQL 中多个参数的逗号分隔查询

SQL中逗号分隔的查询结果转换成单个字符串放到in语句里

PL/SQL 查询 IN 逗号分隔字符串

在 Visual Studio 2008 中使用设计器将逗号分隔列表作为参数传递给 db2 查询的 IN 子句

如何在选择语句的“NOT IN”子句中使用逗号分隔的字符串列表作为 pl/sql 存储的函数参数

IN 运算符的逗号分隔参数,MySQL