0

我有一个表 A 的列 B_ID 引用表 B 中的 B_ID 表 B 有 B_ID 作为主键,C_ID 引用表 C 中的 C_ID

我想从 A_ID 上的 A 连接 B 中选择 B.C_ID = 5 AND B.C_ID = 4

例如,当我这样做时:

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 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 回答
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 子句类似,但在分组后执行。所以内部选择只返回A_ID对应于 (4, 5)-pairs of 的 s C_ID。整个查询总是返回偶数条记录,例如

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

编辑

如果您只想要 A_ID,其中不仅存在 C_ID 4 和 5,而且不存在其他 C_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)

如果这两个数字(本例中为 4 和 5)总是连续的,您可以删除该COUNT(*)=2部分。

(注意:根据您的评论之一,加入在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 回答