表中的数据包含数据值的两种情况

时间:2017-07-14 10:37:00

标签: sql oracle

我有两张桌子:

   A:         B:
  ID          NAME:
  STATE       STATE_ID
              card


A.ID  ||  A.STATE || B.NAME || B.STATE_ID || B.CARD
  1          FOO       Hans      1            44

  2          BAR       HANS      2            44
  1          FOO       JOHN      1            55
  1          FOO       HANS      1            22

我需要的是从表B中检索名称,其中包含两个状态,Foo和Bar,在这种情况下是带有卡号44的Hans。

在这种情况下,当卡片相同时,我们知道我们正在谈论相同的用户(B)。

我试图做的事情:

Select name FROM B 
  INNER JOIN A 
    on (A.ID = B.STATE_ID )

这加入了表,现在我正在尝试合并结果。例如,找到具有状态FOO和BAR的所有B。

但是,状态可以有两个以上的值,并且不应该找到具有状态Foo和notFoo的用户。

然而,我无法想到正确的解决方案。

实现这一结果的最佳方法是什么?

所有帮助和解释都受到高度赞赏

2 个答案:

答案 0 :(得分:2)

我认为最简单的方法是:

SELECT name
FROM B INNER JOIN
     A 
     ON A.ID = B.STATE_ID
WHERE state IN ('foo', 'bar')
GROUP BY name, card
HAVING MIN(state) <> MAX(state);

答案 1 :(得分:1)

如果我正确理解您的要求,您需要如下查询:

SELECT B.Name
FROM B
INNER JOIN A ON b.STATE_ID = A.ID
GROUP BY B.Name
HAVING COUNT(DISTINCT CASE WHEN STATE IN ('Foo', 'Bar') THEN STATE END) = 2 AND
       COUNT(CASE WHEN STATE IN ('Foo', 'Bar') THEN STATE END) = COUNT(*)

HAVING子句中的第一个谓词保证只返回 'Foo''Bar' 的名称。第二个保证只返回包含'Foo''Bar'以及其他的名称。