2

次のテーブル構造があります。

表A

id    name
1     name1
2     name2

表B

a_id   b_id
1      1
1      2

b_idが1と2の両方を持つテーブルAのすべての行を選択するにはどうすればよいですか?表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の1つを含めることができるが、両方を含めることができない可能性

例えば

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

最良のアプローチは、IDを追加するのが簡単なので、Having(Distinct Count)=#of ids(RedFilter's )を使用することです。

他の2つのオプションは、複数のEXISTSまたはIN句(NickB)を使用するか、複数回結合してフィルタリングすることです(以下)が、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 * FROM A JOIN B ON A.id=B.a_id WHERE B.b_id IN(1,2);
于 2012-06-25T20:26:47.167 に答える
1

これが私が思いつくことができるものです、それは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 に答える
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 に答える
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 に答える