我有2个表和一个n:m关系表,如下所示:
tb_1 ----- id_1 1 2 3 tb_2 ----- id_2 10 11 12 tb_nm ------- id_1 id_2 1 10 1 11 2 10 3 10
我想只选择tb_nm行中的id_1,其中id_2 = 10 AND 20 .. 换句话说......在那种情况下,我想只返回id_1 = 1,因为它是id_2 = 10和11的唯一。
我试过了:
SELECT
id_1
FROM
tb_nm
WHERE
id_2 = 10
AND id_2 = 11
它返回零行。
我也试过这个:
SELECT
id_1
FROM
tb_nm
WHERE
id_2 IN (10,11)
并返回所有行... 有什么建议吗?
答案 0 :(得分:1)
我喜欢使用聚合和having
子句来解决这些问题。这是表达这些条件的非常灵活的方式。
针对您的具体情况:
select id_1
from tb_nm
group by id_1
having sum(id_2 = 10) > 0 and
sum(id_2 = 11) > 0;
having
子句中的每个条件都计算其中一个条件为真的每组id_1
值中的行数。
如果你想添加另一个条件,那就很容易了。例如,如果您希望结果中没有12
s,那就是另一个条件。计算具有该值的行数,并检查以确保没有:
having sum(id_2 = 10) > 0 and
sum(id_2 = 11) > 0 and
sum(id_2 = 12) = 0;
答案 1 :(得分:0)
SELECT tt.id_1
FROM tb_nm tt
WHERE tt.id_2 = 10
AND EXISTS (
SELECT *
FROM tb_nm ex
WHERE ex.id_1 = tt.id_1
AND ex.id_2 = 11
);