假设我有一个包含两列id
和val
的表格。我找不到存在一对相等且相反的id
s的所有不同val
s。例如,假设您有下表
id | val
------+------
1 | 3
2 | 5
2 | -5
1 | 4
2 | 6
3 | 9
2 | -6
3 | -9
我希望结果是
result
2
3
结果集中的 2
因为有值5, -5
和6, -6
。由于3
,9, -9
位于结果集中。
我可以使用where exists
来完成此操作。像
select distinct tab1.id from tab tab1
where exists (
select * from tab tab2
where tab1.id = tab2.id
and tab1.val = -tab2.val
);
但是我担心像这样的查询具有时间复杂度O(n^2)
,因为它的计算类似于嵌套循环(?)。但是,可以通过扫描表在O(n)
时间计算此值(并在O(1)
查找时间跟踪数据结构中先前看到的结果)。编写此类查询的最佳方式是什么?
答案 0 :(得分:0)
我们应该解释您的请求以及如何设置索引。
可能也可以这样做:
WITH pos AS (
SELECT id, val FROM tab WHERE val > 0),
neg AS (
SELECT id, val FROM tab WHERE val < 0)
SELECT DISTINCT id
FROM pos JOIN neg USING (id)
WHERE pos.val = neg.val;
使用正确的索引,这可能很快。还取决于数据量。