SQL / Criteria查询包含所有内容?

时间:2013-12-10 21:05:02

标签: java sql criteria contains criteria-api

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

现在我想从表A WHERE B.id = 1 AND B.id = 2获得所有条目。

目前我必须遵循以下代码:

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 IN (...)为我提供了表A WHERE b.id = 1 OR b.id = 2当然的所有条目,而WHERE b.id = 1 AND 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
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

但我可以拥有无​​数的b.ids。所以这个查询会变得很慢......

是不是像IN那样表现得像我想要的?它应该使用Criteria Query实现:

Join<A, B> aB = root.join(A_.bs); // as this is a @ManyToMany relationship
...

但我也对纯SQL解决方案感到满意。

3 个答案:

答案 0 :(得分:1)

在MySQL上测试:

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

SQL Fiddle here

答案 1 :(得分:0)

我必须承认我并没有真正关注问题和问题,但是你是说这不起作用:

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)

答案 2 :(得分:0)

据我了解,这是一个多对多关系,您希望根据表B上的Id过滤数据。

首先,你的第一个查询对我来说似乎没问题;为清楚起见,我会写如下:

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;

现在,如果您想要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
where
    b.id in (1,2);

选中此SQLFiddle example

希望这有帮助