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
Теперь я хотел бы иметь все записи из таблицы А ГДЕ B.id = 1 И B.id = 2.SQL/Criteria Query СОДЕРЖИТ ВСЕ?
На данный момент у меня в следующий код:
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 (...)
дает мне все записи из таблицы А ГДЕ 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
, который ведет себя так, как я хочу? И это должно быть выполнено с использованием критерия Критерии:
Join<A, B> aB = root.join(A_.bs); // as this is a @ManyToMany relationship
...
Но я также был бы доволен чистым SQL-решением.
Я не уверен, что правильно понял вопрос, но я думаю, что это случай для левого присоединения http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins .html –
Ваш пример будет более ясным, если вы измените запись в A_B с 2,4 до 2,2. Затем укажите, что запись 2 в таблице A не должна возвращаться, несмотря на то, что она соответствует одному значению (поскольку оно не соответствует другому значению). – mdahlman