选择postgresql进行组合

时间:2015-12-13 13:18:33

标签: sql postgresql combinations postgresql-9.3

我有以下2个表格: SQL Tables

我有一个id列表(1,2,3,4,5,6,7,8,...,10000)。 这些ID的唯一组合将插入另一个表中。

那么,我怎样才能找到这些组合如果我将id列表传递给搜索。

例如,我搜索ARRAY([2,3,4])。该组合仅适用于unique_combnation 1,因此结果如下:

1 3
1 2
1 4

没有任何包含ID ARRAY([2,3,4])的unique_comb。

如果我搜索[1,4],结果将如下:

1 3
1 2
1 4
2 2
2 4
2 5

我该怎么办?我知道怎么做得不好:

  1. CREATE TEMPORARY TABLE t1
  2. 迭代给定的id:SELECT * FROM .. where id = ANY(ARRAY[1,4])并获取所有行,将所有行插入t1。
  3. 然后通过unique_comb对所有内容进行分组。
  4. 然后计算组数。如果唯一组合的数量不超过1,则返回唯一组合的ID,否则(唯一组合> 1)不返回任何内容
  5. 这是用1-2个sql行创建它的方法吗?我正在使用postgresql 9.3

    select unique_comb t2 where id = ANY(ARRAY[1, 4]) group by unique_comb ...
    

    以下答案是正确的。我已经修改了一点查询,它开始工作。

    它会从表格中选择几个ID。

    select unique_comb, array_agg(id) t2 where id = ANY(ARRAY[1, 4]) group by unique_comb的结果如下:

2 个答案:

答案 0 :(得分:0)

您描述的过程似乎类似于group by

select unique_comb
from t2
where id = ANY(ARRAY[1, 4])
group by unique_comb
having count(*) = array_length(ARRAY[1, 4], 1);

答案 1 :(得分:0)

对于 表和 数组(不是仅包含2或3个元素的示例) ,使用递归CTE的更复杂的查询会更快。

在任何情况下,您都需要(id, unique_comb)上的索引 - 按此顺序!主键很好用。

WITH RECURSIVE cte AS (
   SELECT unique_comb, id, 2 AS i  -- start with index for 2nd array elem
   FROM   tbl
   WHERE  id = 5  -- *first* element array

   UNION ALL
   SELECT t.unique_comb, t.id, c.i + 1
   FROM   cte c
   JOIN   tbl t USING (unique_comb)
   WHERE  t.id = ('{5, ... long array ... , 4}'::int[])[c.i]  -- your array here
   )
SELECT unique_comb
FROM   cte
WHERE  id = 4;  -- *last* element of array

这种方法的优点是在游戏早期排除大多数(或所有)行。如果您有关于价值频率的信息,您可以将最稀有的元素放在第一位。