这是我想在 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”执行“n-1”并集SELECT
声明
我知道JOOQ可以进行多个联合SELECT
声明。但是有没有一个好的方法来实现这种后 Java 8 风格呢?也许使用 Steam.collect()?
这就是我所拥有的,但想知道我是否可以做得更好
String firstValueToQuery = valuesToQuery.get(0);
Select<Record5<UUID, UUID, String, Integer, String>> selectQuery = getSelectQueryForValue(firstValueToQuery);
valuesToQuery.stream()
.skip(1)
.forEach(valueToQuery -> selectQuery.unionAll(getSelectQueryForValue(valueToQuery)));
selectQuery.fetchStream();
这是我的实现方式getSelectQueryForValue
private Select<Record5<UUID, UUID, String, Integer, String>> 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 以便数据库通过使用正确的索引隐式地选择更快的查询计划