如何根据oracle中组中的2个不同标准比较2个不同的记录?

时间:2017-03-21 19:34:04

标签: sql database oracle

我需要修改以下代码来搜索其中一个幸存为空而另一个不为空的组。目前,查询返回填充了两个幸存的组。我正在寻找所有组,其中一个记录A的幸存与另一个记录B中的id不匹配,但仅限于记录B中的幸存为空的情况。

SELECT *
FROM MY_TABLE t3
WHERE t3.GROUP_id IN (
SELECT t1.GROUP_id
FROM MY_TABLE t1, MY_TABLE t2
WHERE t1.id <> t2.id
AND t1.GROUP_id = t2.GROUP_id
AND t1.id <> t2.surv
AND t2.id <> t1.surv
);

这将返回填充两个幸存者的差异。我错过了什么?

编辑:

---------------------------------
| group   |  id   |  surv        |
----------------------------------
|   1     | 1     |  null        |
|   1|    | 2     |    1         |
|   2     | 3     |    107       |
|   2     | 4     |  null        |
|   3     | 5     |  89          |
|   3     | 6     |  89          |
----------------------------------

返回

---------------------------------
| group   |  id   |  surv        |
----------------------------------
|   2     | 3     |    107       |
|   2     | 4     |  null        |
----------------------------------

原因: 第1组与第二条记录的存在具有id 1匹配;因此,我们不希望它返回。

组2,id 3有一个与另一个记录的ID不匹配的幸存。与此同时,第二个幸存字段为空。这就是我们需要的东西。

组3,两者都存在非空。这些都不需要。

编辑2:我最终提出了这个问题:

SELECT cluster_id, oidmu, survoid
FROM MY_TABLE t3
WHERE t3.GROUP_id IN (
  SELECT t1.GROUP_id
  FROM MY_TABLE t1, MY_TABLE t2
  WHERE t1.ID <> t2.ID
  AND t1.GROUP_id = t2.GROUP_id
  AND (t1.ID <> t2.SURV and t1.SURV is null)
);

2 个答案:

答案 0 :(得分:0)

and t2.surv is null添加到您的查询中。

SELECT *
FROM MY_TABLE t3
WHERE t3.GROUP_id IN (
SELECT t1.GROUP_id
FROM MY_TABLE t1, MY_TABLE t2
WHERE t1.id <> t2.id
AND t1.GROUP_id = t2.GROUP_id
AND t1.id <> t2.surv
AND t2.id <> t1.surv
and t2.surv is null
);

答案 1 :(得分:0)

如果你只想要,也许聚合会这样做:

SELECT t.GROUP_ID
FROM MY_TABLE t
GROUP BY GROUP_ID
HAVING COUNT(surv) > 0 AND      -- at least one is not null
       COUNT(surv) < COUNT(*);  -- at least one is null

实际上,即使您确实需要原始行,也可以使用分析函数执行此操作:

SELECT t.GROUP_ID
FROM (SELECT t.*, COUNT(*) OVER (PARTITION BY GROUP_ID) as cnt,
             COUNT(surv) OVER (PARTITION BY GROUP_ID) as cnt_surv
      FROM MY_TABLE t
     ) t
WHERE cnt_surv > 0 and cnt_surv < cnt