我有两张桌子:
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的用户。
然而,我无法想到正确的解决方案。
实现这一结果的最佳方法是什么?
所有帮助和解释都受到高度赞赏
答案 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'
以及其他的名称。