SQL中IN子句的问题

SQL中IN子句的问题,sql,Sql,我们已经注意到,在SQL的in子句中,可以以逗号分隔的值传递的ID/变量的数量似乎是最大的。为了避免这种情况,我们将所有ID存储在一个表中,并在in子句中执行SELECT。然而,这意味着需要额外的数据库操作来存储和检索ID。在没有选择的情况下,还有其他方法可以使用吗 问候, Sameer在SQL Server 2008中,您可以声明一个表变量并将其从客户端或过程之间传递到查询。在SQL Server 2008中,您可以声明一个表变量并将其从客户端或过程之间传递到查询。对于数量适中的值,我在SEL

我们已经注意到,在SQL的in子句中,可以以逗号分隔的值传递的ID/变量的数量似乎是最大的。为了避免这种情况,我们将所有ID存储在一个表中,并在in子句中执行SELECT。然而,这意味着需要额外的数据库操作来存储和检索ID。在没有选择的情况下,还有其他方法可以使用吗

问候,


Sameer

在SQL Server 2008中,您可以声明一个表变量并将其从客户端或过程之间传递到查询。

在SQL Server 2008中,您可以声明一个表变量并将其从客户端或过程之间传递到查询。

对于数量适中的值,我在SELECT中不会想到。。在任何rdbms上都会如此昂贵

您可以将IDs表内部连接起来,也可以将INs分解:

WHERE X IN (123,456 ...)
   OR X IN (789,987 ...)
   ...

对于数量适中的价值观,我不会在SELECT中想到。。在任何rdbms上都会如此昂贵

您可以将IDs表内部连接起来,也可以将INs分解:

WHERE X IN (123,456 ...)
   OR X IN (789,987 ...)
   ...

如果将其放在表中,为什么仍使用in子句,为什么不直接加入表?

如果将其放在表中,为什么仍使用in子句,为什么不直接加入表?

同意Alex的观点

而不是

Select * From TableA Where ID IN (Select ID from IDTable)
使用

加入将自动为您过滤ID。

同意Alex的意见

而不是

Select * From TableA Where ID IN (Select ID from IDTable)
使用


加入将自动为您筛选ID。

您使用的是哪种数据库服务器?答案取决于此数据。SQL server 2007和Oracle 10.2您使用的是什么数据库服务器?答案取决于此数据。SQL server 2007和Oracle 10。2@Quassnoi感谢您提供深入文章的链接。在OPs的例子中,它们将ID存储在一个表中,所以我只是指出,如果它们所做的只是过滤,那么连接方式将是等效的。另外,出于可读性和风格的原因,如果我有选择的话,我会使用join方法。还值得注意的是,带有逗号分隔值的IN在实际处理时会扩展为一组OR。@Jemery:IN带有逗号分隔值,在达到某个阈值时会扩展为常量扫描。这些值被视为一个表,受正常的基于集合的操作hash join、merge join等的约束。我不知道!您是否知道阈值是多少,或者它是否随查询而变化?我问这个问题的原因是因为我曾经在一些项目中工作过,其中存储过程从SSRS参数接收一个逗号分隔的值列表。我完成了解析字符串的工作,并将ID放在临时表中,以便连接到它。我认为这仍然是个好主意,因为用户可以只选择1、2或parm列表中的所有内容。我们遇到麻烦的另一个原因是,我认为如果我们只想使用列表,就必须使用动态SQL。@quassno感谢您提供了深入文章的链接。在OPs的例子中,它们将ID存储在一个表中,所以我只是指出,如果它们所做的只是过滤,那么连接方式将是等效的。另外,出于可读性和风格的原因,如果我有选择的话,我会使用join方法。还值得注意的是,带有逗号分隔值的IN在实际处理时会扩展为一组OR。@Jemery:IN带有逗号分隔值,在达到某个阈值时会扩展为常量扫描。这些值被视为一个表,受正常的基于集合的操作hash join、merge join等的约束。我不知道!您是否知道阈值是多少,或者它是否随查询而变化?我问这个问题的原因是因为我曾经在一些项目中工作过,其中存储过程从SSRS参数接收一个逗号分隔的值列表。我完成了解析字符串的工作,并将ID放在临时表中,以便连接到它。我认为这仍然是个好主意,因为用户可以只选择1、2或parm列表中的所有内容。我们遇到麻烦的另一个原因是,我认为如果我们只想使用列表,就必须使用动态SQL。当然我可以做到。我的问题的主旨不是将ID存储在表中。我已经在变量中有了这些ID,但是由于可以传递到in查询中的变量数量有限制,我不得不将这些ID存储在一个表中,使用JOIN或另一个db hit进行额外的数据库命中和重定时,我确信我可以做到这一点。我的问题的主旨不是将ID存储在表中。我在变量中已经有了这些ID,但是由于可以传递到in查询中的变量数量存在限制,我不得不将这些ID存储在一个表中,使用JOIN进行额外的数据库hit和retieve,或者存储在另一个db hitI中。我已经有了这些变量。以123456中的X为例。。。或者789987中的X。。。123456等已在变量中。但我不能列出所有12000个,因为有一个限制
对这个。我试图避免再次点击数据库进行保存,然后点击Select12000?!如何将它们传递给in子句?我已经有了变量。以123456中的X为例。。。或者789987中的X。。。123456等已在变量中。但我不能列出所有12000个,因为这是有限制的。我试图避免再次点击数据库进行保存,然后点击Select12000?!如何将它们传递给in子句?我使用的查询是嵌入j2ee代码中的HQL hibernate查询语言。这也需要与oracle 10.2配合使用。不确定这是否有效我的查询是在j2ee代码中嵌入的HQL hibernate查询语言中进行的。这也需要与oracle 10.2配合使用。我不确定这是否有效