这是我想在MySQL中尝试的查询
SELECT A.x
FROM A
WHERE A.y = 'P'
UNION
SELECT A.x
FROM A
WHERE A.y = 'Q'
上面是我尝试的原始查询的简化版本.在我的原始查询中,每个SELECT语句都使用INNER JOIN涉及多个表
如果我需要查询的表’A’的’y’列中可能的值数是’n’,那么我的查询将涉及对’n’SELECT语句执行’n-1’联合
我知道JOOQ可以执行多个SELECT语句的并集.但是,有没有一种很好的方法来实现这种Java 8风格?也许使用Steam.collect()?
这就是我所拥有的,但想知道我是否可以做得更好
String firstValueToQuery = valuesToQuery.get(0);
Select> selectQuery = getSelectQueryForValue(firstValueToQuery);
valuesToQuery.stream()
.skip(1)
.forEach(valueToQuery -> selectQuery.unionAll(getSelectQueryForValue(valueToQuery)));
selectQuery.fetchStream();
这是我实现getSelectQueryForValue的方法
private Select> getSelectQueryForValue(String valueToQuery) {
return jooq.select(
A.P,
A.Q,
A.R,
A.S,
A.T)
.from(A)
.where(A.Y.eq(valueToQuery));
}
PS:我知道我宁愿使用“ IN”子句,如下所示
SELECT A.x
FROM A
WHERE A.y IN ('P','Q',...)
但是根据我当前在数据库中的数据分布,MySQL正在使用次优的查询计划.因此,使用UNION使得数据库通过使用正确的索引隐式地倾向于更快的查询计划