2

我有以下表结构。

表 A

id    name
1     name1
2     name2

表 B

a_id   b_id
1      1
1      2

如何选择表 A 中 b_id 为 1 和 2 的所有行?表B是表A和另一个表的映射表,其内容与本题无关。

感谢您的时间和帮助!

4

6 回答 6

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

SQL 小提琴示例

于 2012-06-25T20:26:59.803 回答
2

在这样的问题上,正确性可能很棘手,因为您的示例数据缺少关键案例。B_ID 的重复值以及它可以包含其中一个 id 但不能同时包含两者的可能性

例如

| A_ID | B_ID |
---------------
|    1 |    1 |
|    1 |    2 |
|    2 |    1 |
|    2 |    1 |

最好的方法是使用 Have (Distinct Count) = # of ids ( 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

演示

于 2012-06-25T20:50:21.803 回答
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 以避免重复。

于 2012-06-25T20:45:40.590 回答
1
SELECT * FROM A JOIN B ON A.id=B.a_id WHERE B.b_id IN(1,2);
于 2012-06-25T20:26:47.167 回答
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 存在,但这里有一个显示它工作!

于 2012-06-25T20:32:12.530 回答
0
SELECT TableA.* FROM TableA WHERE TableA.id IN(
SELECT TableB.a_id FROM TableB WHERE TableB.b_id IN(1,2))
于 2012-06-25T20:29:06.377 回答