我有以下表结构。
表A
id name
1 name1
2 name2
表B
a_id b_id
1 1
1 2
如何选择同时包含b_id为1和2的表A的所有行?表B是表A和另一个表之间的映射表,其内容与此问题无关。
感谢您的时间和帮助!
答案 0 :(得分:6)
此查询使用COUNT(DISTINCT)
来确保两个值都存在。如果我没有使用DISTINCT,它可能会错误地将TableB中看起来像这样的行计为不匹配的行:
a_id b_id
1 1
1 1
select a.id, a.name
from TableA a
inner join (
select a_id
from TableB
where b_id in (1, 2)
group by a_id
having count(distinct b_id) = 2 #this number matches no. of unique values in IN clause
) b on a.id = b.a_id
答案 1 :(得分:2)
在这样的问题上,正确性可能会很棘手,因为您的样本数据缺少关键案例。 B_ID的重复值以及它可能包含其中一个ID但不能同时包含两个
的可能性e.g。
| A_ID | B_ID |
---------------
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 2 | 1 |
最好的方法是使用Having(Distinct Count)=#of id(RedFilter's),因为它很容易添加更多ID
另外两个选项是使用或多个EXISTS或IN子句(NickB's)或多次加入和过滤(下图),但如果需要添加其他ID,则可能会变得非常长。
SELECT DISTINCT a.id,
a.name
FROM TableA a
INNER JOIN TableB b1
ON a.id = b1.a_id
and b1.b_id = 1
INNER JOIN TableB b2
ON a.id = b2.a_id
and b2.b_id = 2
答案 2 :(得分:1)
SELECT * FROM A JOIN B ON A.id=B.a_id WHERE B.b_id IN(1,2);
答案 3 :(得分:1)
这是我能想到的,它使用一个子查询。
SELECT * FROM table_a a1
JOIN table_b b1
ON a1.id = b1.a_id
WHERE b1.b_id = 1 AND
EXISTS(
SELECT b2.b_id
FROM table_b b2
WHERE a1.id = b2.a_id
AND b2.b_id = 2
)
不知道SQL Fiddle存在,但here is one显示它有效!
答案 4 :(得分:1)
我也会自我加入:
SELECT A.* FROM B B1
JOIN B B2 ON B2.a_id = B1.a_id
JOIN A ON A.id = B1.a_id
WHERE B1.b_id = 1 AND B2.b_id = 2
我对此进行了测试,但它确实有效。如果(B.a_id,B.b_id)不是唯一的,那么你需要DISTINCT来避免重复。
答案 5 :(得分:0)
SELECT TableA.* FROM TableA WHERE TableA.id IN(
SELECT TableB.a_id FROM TableB WHERE TableB.b_id IN(1,2))