SQL查询相等和相反的值

时间:2017-11-16 16:38:27

标签: postgresql database-performance

假设我有一个包含两列idval的表格。我找不到存在一对相等且相反的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, -56, -6。由于39, -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)查找时间跟踪数据结构中先前看到的结果)。编写此类查询的最佳方式是什么?

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;

使用正确的索引,这可能很快。还取决于数据量。