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 回答