0

テーブルBのB_IDを参照する列B_IDを持つテーブルAがあります。テーブルBの主キーとしてB_IDがあり、テーブルCのC_IDを参照するC_IDがあります。

B.C_ID=5かつB.C_ID=4であるA_IDのA結合Bから選択したい

たとえば、私がこれを行うとき:

select from A join B on B.A_ID = A.A_ID

結果が次の場合:

A_ID  |  B_ID  |  C_ID
 1    |   1    |   4
 1    |   2    |   5

次に、クエリで両方の行を返すようにしますが、結果が次の場合:

A_ID  |  B_ID  |  C_ID
 1    |   1    |   4

クエリが0行を返すようにしたい。

4

3 に答える 3

1
SELECT * FROM A INNER JOIN B ON A.B_ID = B.B_ID
WHERE EXISTS(SELECT * FROM B WHERE C_ID = 4)
AND EXISTS(SELECT * FROM B WHERE C_ID = 5)

うまくいくでしょう-おそらくもっと良い方法がありますが、私に考えさせてください...

(もちろん、上記はテーブルに1/2行しかないことを前提としています)

または

SELECT * FROM A
INNER JOIN B ON A.B_ID = B.B_ID
WHERE (SELECT COUNT(*) FROM B WHERE C_ID IN (4,5)) > 1

それで遊んでください!

于 2012-12-09T20:13:04.580 に答える
0

これを試して

SELECT
    whatever
FROM
    A
    INNER JOIN B
        ON A.A_ID = B.A_ID
WHERE
    B.C_ID IN (4, 5)

また

SELECT
    whatever
FROM
    A
    INNER JOIN B
        ON A.A_ID = B.A_ID
WHERE
    B.C_ID = 4 OR B.C_ID = 5

アップデート

一致するペアのみが必要な場合

SELECT
    whatever
FROM
    A
    INNER JOIN B
        ON A.A_ID = B.A_ID
WHERE
    A.A_ID IN (SELECT A_ID
               FROM B
               WHERE C_ID IN (4, 5)
               GROUP BY A_ID
               HAVING COUNT(*) = 2) AND
    B.C_ID IN (4, 5)

副選択A_IDは、レコードごとにグループ化してカウントします。HAVING句はWHERE句と同様に機能しますが、グループ化後に実行されます。したがって、内側のselectは、A_IDの(4、5)ペアに対応するsのみを返しますC_ID。クエリ全体は常に次のような偶数のレコードを返します

A_ID | B_ID | C_ID
 1 | 1 | 4
 1 | 2 | 5
 2 | 3 | 4
 2 | 4 | 5

編集

C_ID 4と5だけでなく、それ以上C_IDが存在しないA_IDのみが必要な場合は、クエリを次のように変更します。

SELECT B.*
FROM A INNER JOIN B ON A.A_ID = B.A_ID
WHERE B.C_ID IN (4, 5) AND
      A.A_ID IN (SELECT A_ID
                 FROM B
                 GROUP BY A_ID
                 HAVING MIN(C_ID)=4 AND MAX(C_ID)=5 AND COUNT(*)=2)

2つの数字(この例では4と5)が常に連続している場合は、COUNT(*)=2パーツを削除できます。

(注:コメントの1つによると、結合はA_ID列にあります。すべての例で変更しました。)

ロビンによる更新

ありがとう、あなたの助けを借りて私はこれを思いついた:

SELECT
    *
FROM
    A a
    INNER JOIN B
        ON a.A_ID = B.A_ID
WHERE
    (SELECT COUNT(*) FROM B b WHERE b.A_ID = a.A_ID and C_ID IN (4, 5)) =
 (SELECT COUNT(*) FROM A aa INNER JOIN B b ON aa.A_ID = b.A_ID WHERE b.A_ID = a.A_ID)
于 2012-12-09T20:06:48.297 に答える
0
 select B.* from
    A join B on B.B_ID = A.B_ID, 
    (
    select 1 as test from 
    (
    select distinct c_Id from 
    A join B on B.B_ID = A.B_ID
    where c_Id in (4,5)
    ) tmp
    having COUNT(*) = 2
    ) tmp2
    where tmp2.test = 1
于 2012-12-09T20:31:59.997 に答える