我有以下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
我该怎么办?我知道怎么做得不好:
SELECT * FROM .. where id = ANY(ARRAY[1,4])
并获取所有行,将所有行插入t1。这是用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
的结果如下:
答案 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
这种方法的优点是在游戏早期排除大多数(或所有)行。如果您有关于价值频率的信息,您可以将最稀有的元素放在第一位。