0

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

Table A
id | name
1  | foo
2  | bar

Table B
id | name | default
1  | 123  | 1
2  | 321  | 0
3  | 456  | 1

Table C
A_id | B_id
1    | 2
1    | 3

CにはないABペアを取得したいと思います(これらのペアがB.default = 1であるという条件付き)

したがって、期待される結果は次のようになります。

A_id | B_id
1    | 1
2    | 1
2    | 3

しかし、テーブルBを結合する方法について完全に混乱しています:

SELECT A.id, B.id
FROM A

LEFT OUTER JOIN C
ON C.A_id = A.id

LEFT OUTER JOIN B
AND C.B_id = B.id
AND B.default = 1
4

1 に答える 1

1

最初にすべての A ペアを生成し、次に C と比較します

NOT EXISTS は、LEFT JOIN よりもわずかに正確です (反セミ結合)。

SELECT
    X.A_id, X.B_id
FROM
    (
    SELECT
      A.id AS A_id,
      B.id AS B_id
    FROM
      A CROSS JOIN B
    WHERE
      B.default = 1
    ) X
WHERE
   NOT EXISTS (SELECT *
      FROM
         C
      WHERE
         C.A_id = X.A_id
         AND
         C.B_id = X.B_id)

ただし、これにより、この結果が得られます。(1,3) の C タプルのみが 4 つの AB ペアに一致します

A_id | B_id
1    | 1
2    | 1
2    | 3
于 2012-11-07T13:10:16.253 に答える