使用具有大量项目的IN条件

时间:2016-05-19 15:24:57

标签: sql amazon-redshift in-clause

我有来自外部数据库的id的本地数据。我想使用这些id从该外部数据库中选择数据,所以我做了类似的事情:

SELECT * FROM table WHERE id IN (:listofids)

但是我注意到了(我不确定它是数据库设置的DB还是数据库的类型或者什么)在该IN语句中可以允许最大数量的值。如果可能,我当然会WHERE id IN (SELECT id FROM ...),但有时候使用外部数据是不可能的。

我的问题:

  1. 除了我在上面做的事情之外,我还有什么选择?
  2. 最大项目的限制是在DB级别设置的,DB的类型是什么?现在我特别关注外部RedShift数据库,但我查看了他们的文档,他们没有提到限制。我们的本地数据库有2100的限制,但我使用的另一个是9999.此外,一旦列表变大,它可能变慢,所以我也在寻找性能提升。
  3. 我应该in () OR in () OR in()。这看起来不太光滑。所有这些选择都可行吗?
  4. 我已经阅读了一些关于可能使用临时表来执行此操作的内容,但没有任何示例。如何将数据加载到临时表中,然后加入到我想要从中获取数据的表中?

2 个答案:

答案 0 :(得分:1)

避免临时表的一个非常简单的解决方案是执行以下操作:

SELECT 
    t.* 
FROM 
    [table] t
    INNER JOIN (
        SELECT 'id1' AS id
        UNION ALL
        SELECT 'id2'
        UNION ALL
        SELECT 'id3') i ON i.Id = t.Id;
显然,使用大量UNION创建子查询的工作要多得多,但这有效地创建了一个临时表,您可以使用它而不必担心实现它。

答案 1 :(得分:0)

  

除了我在上面做的事情之外,我还有什么选择?

它们是有限的 - 您可以链接一长串OR id = X来电,但与IN相比,您可能会遇到严重的性能问题。

best 选项在性能方面是加入服务器端的表(参数,临时,CTE,内联UNION或静态)。但是,这并不总是一个选项,具体取决于您执行查询的方式以及您拥有的权限。

当然,您也可以为每个值执行单独的查询,这样可以更容易编码,但也可能存在性能问题。

  

最大项目的限制是在DB级别设置的,DB的类型是什么?

这是特定于平台的,所以没有通用答案

  

我应该在()或()或()中进行。这似乎不太光滑。所有这些选择都可行吗?

这是添加到上述其他选项的一个选项 - 您必须尝试查看性能影响。

  

我已经阅读了一些关于可能使用临时表来执行此操作的内容,但没有任何示例。如何将数据加载到临时表中,然后加入到我想要从中获取数据的表中?

这取决于平台,您的权限,可用的API等。