获取两个值彼此唯一的行

时间:2013-04-25 14:55:15

标签: sql postgresql distinct

感兴趣的值为EIN和注册号REG 每个值都有很多记录。

我想知道的是哪一对值只相互出现(或空白EIN)。

ID     EIN      REG
12     321      124
13     321      125
14     322      168
15     322      168
16     323      171
17     323      171
18     323

所以在上面的例子中,我想选择322和168,因为每次它们出现时,它们一起出现,但我也想选择323和171,因为它们永远不会出现另一个值,只是一个非-值。 100%的记录具有EIN,但较小的部分具有注册ID。

有关如何查询的任何建议吗?

2 个答案:

答案 0 :(得分:5)

我使用此查询获得了您要查找的结果:

with cte as 
(
  select ein, count(distinct reg) as occ
    from test b    
    group by ein
    having count(distinct reg) = 1
)
select distinct t.ein, t.reg 
    from cte c 
    join test t 
      on c.ein = t.ein;

sqlfiddle

但是,我确信还有其他方法可以做到这一点。

答案 1 :(得分:3)

许多可能的方法之一:

SELECT DISTINCT ein, reg
FROM   test t
WHERE  reg is NOT NULL
AND    NOT EXISTS (
   SELECT 1 FROM test t1
   WHERE t1.ein = t.ein AND t1.reg <> t.reg
   OR    t1.reg = t.reg AND t1.ein <> t.ein);
ein | reg
----+-----
323 | 171
322 | 168

-> SQLfiddle.

  • 我假设EINNOT NULL,但REG可以是NULL,因为您写道:
  

100%的记录具有EIN,但较小的部分具有注册ID。

  • NULL从不符合运营商<>的资格,因此不排除(323, 171)

  • 我从结果中排除了包含reg IS NULL的行,这似乎是您的意图。因此不包括(323, NULL)