Java SQL/条件查询是否包含所有?
现在,我想得到表A中的所有条目,其中B.id=1和B.id=2 目前,我必须执行以下代码:Java SQL/条件查询是否包含所有?,java,sql,criteria,contains,criteria-api,Java,Sql,Criteria,Contains,Criteria Api,现在,我想得到表A中的所有条目,其中B.id=1和B.id=2 目前,我必须执行以下代码: Table A: Table A_B: Table B: id | a a_id | b_id id | b ------ ----------- ------ 1 | w 1 | 1 1 | s 2 | x 1 | 2
Table A: Table A_B: Table B:
id | a a_id | b_id id | b
------ ----------- ------
1 | w 1 | 1 1 | s
2 | x 1 | 2 2 | t
3 | y 2 | 4 3 | u
4 | z 4 | 4 4 | v
我被卡住了WHERE b.id IN(…)
给出了表A中的所有条目,其中b.id=1或b.id=2当然是,而其中b.id=1和b.id=2根本没有给出结果
我找到的唯一可能的解决方案是使用INTERSECT
:
SELECT *
FROM A a
JOIN A_B ab ON a.id = ab.a_id
JOIN B b ON ab.b_id = b.id
但是我可以有无限多个b.id。所以这个查询会变得非常慢
在
中是否有类似于
的东西,它的行为符合我的要求?并且应该使用条件查询来实现:
SELECT *
FROM A a
JOIN A_B ab ON a.id = ab.a_id
JOIN B b ON ab.b_id = b.id
WHERE b.id = 1
INTERSECT
SELECT *
FROM A a
JOIN A_B ab ON a.id = ab.a_id
JOIN B b ON ab.b_id = b.id
WHERE b.id = 2
Join aB=root.Join(A.bs);//因为这是一种多人的关系
...
但是我也很乐意使用纯SQL解决方案。我必须承认,我并没有真正理解这个问题和问题,但你是说这不起作用:
Join<A, B> aB = root.join(A_.bs); // as this is a @ManyToMany relationship
...
据我所知,这是一个多对多关系,您希望根据表B
上的Id过滤数据
首先,我觉得你的第一个问题还可以;为了清楚起见,我将写如下:
SELECT *
FROM B b
LEFT JOIN A_B ab ON b.id = ab.b_id
LEFT JOIN A a ON ab.a_id = a.id
WHERE b.id IN (1,2)
现在,如果您想要所有b.id=1
或b.id=2
的记录,应该可以:
select
a.id, a.a, b.id, b.b
from
A as a
inner join A_B as ab on a.id = ab.a_id
inner join B as b on ab.b_id = b.id;
检查这个
希望这有助于在MySQL上测试:
select
a.id, a.a, b.id, b.b
from
A as a
inner join A_B as ab on a.id = ab.a_id
inner join B as b on ab.b_id = b.id
where
b.id in (1,2);
.我不确定我是否正确理解了这个问题,但我认为这是一个左连接的情况。如果将a_B中的记录从2,4更改为2,2,您的示例将更加清晰。然后指出表A中的记录2不应返回,尽管它与一个值匹配(因为它与另一个值不匹配)。请再次读取它。我用INTERSECT找到了一个解决方案。但您的查询只给出表A的结果,其中b.id=1或b.id=2。但是我想要表A中的所有条目,其中b.id=1和b.id=2。嘿,谢谢。我应该写一个SQL提琴。。。我修改了你的:(更改了A_B表中的条目)。结果现在应该只包含a.id=1,因为它是唯一匹配b.id=1和b.id=2的条目。这取决于计数。。。因此,如果A_B包含记录2,2两次,它将返回太多记录。
select TableA.id, count(*)
from tableA
join tableA_B on TableA.id=TableA_B.a_id
where b_id =1 or b_id=2
group by tableA.id
having count(*)=2