【问题标题】:SQL/Criteria Query CONTAINS ALL?SQL/Criteria 查询包含所有?
【发布时间】:2013-12-28 14:26:05
【问题描述】:
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 中的所有条目,其中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.id。所以这个查询会变得很慢...

难道没有像IN 这样的东西表现得像我想要的那样吗?并且应该使用 Criteria Query 来实现:

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

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

【问题讨论】:

  • 我不确定我是否正确理解了这个问题,但我认为这是左连接 codinghorror.com/blog/2007/10/… 的情况
  • 如果您将 A_B 中的记录从 2,4 更改为 2,2,您的示例会更清晰。然后指出尽管匹配了一个值,但不应返回表 A 中的记录 2(因为它与另一个值不匹配)。

标签: java sql criteria contains criteria-api


【解决方案1】:

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

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)

【讨论】:

  • 再读一遍。我找到了使用 INTERSECT 的解决方案。但是您的查询只给了我来自表 A 的结果,其中 b.id = 1 OR b.id = 2。但我想要表 A 中的所有条目,其中 b.id = 1 AND b.id = 2。
【解决方案2】:

据我了解,这是一个多对多关系,您想根据表 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

希望对你有帮助

【讨论】:

  • 嘿,谢谢。我应该写一个 SQL 小提琴...我修改了你的:sqlfiddle.com/#!2/6628f/1(更改了 A_B 表中的条目)。结果现在应该只包含 a.id = 1,因为它是唯一匹配 b.id = 1 和 b.id = 2 的条目
【解决方案3】:

在 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.

【讨论】:

  • 这依赖于计数...因此如果 A_B 包含两次记录 2,2 则会返回太多记录。
猜你喜欢
  • 1970-01-01
  • 2022-11-26
  • 2015-03-03
  • 2021-12-08
  • 1970-01-01
  • 2020-12-30
  • 2018-04-18
  • 1970-01-01
相关资源
最近更新 更多