[英]Distinct with select few columns doesn't work in JOOQ vs MySQL
下面的 SQL 查询格式在 MySQL 中工作正常
select distinct(emp.id), emp.fname, emp.name from employee emp;
在 jOOQ 中,我们可以在查询中使用.selectDistinct
或选择字段,但无法执行上述操作。
如果我确实选择了 distinct(allfields),JOOQ 工作正常。 但是,它在所有列中都不同,例如 distinct(emp.id)、distinct(emp.fname)、distinct(emp.name)
它是 JOOQ 中的错误还是可以以相同的方式执行或将每个单独的列置于不同的位置以单独对一个列具有相同的性能?
请指教。
您认为您仅在一列上应用了“不同的功能”,但这不是您要做的。 你只是把你的第一列放在括号里,就像你可以对所有其他人做的那样,即使没有distinct
select (emp.id), (emp.fname), (((emp.name))) from employee emp;
它没有效果,即使在 MySQL 中也是如此。 DISTINCT
子句仅应用于一列意味着什么? 你会为其他列预测什么价值? 一个随机的? 例如:
+----+-------+------+
| ID | FNAME | NAME |
+----+-------+------+
| 1 | A | A |
| 1 | B | B |
+----+-------+------+
您期望只生成第一行还是只生成第二行?
SQL 操作的逻辑顺序
请注意,在 SQL 中,对于您的语句(假设语法) ,操作的逻辑顺序是:
from employee
select id, fname, name
distinct
换句话说, DISTINCT
操作“发生在”整个SELECT
操作或投影之后。 即使它似乎是SELECT
一部分,在语法上,它也不是。 我还在这篇关于DISTINCT
和ORDER BY
是如何相关的博客文章中解释了这一点,这是 SQL 中另一个常见的混淆来源。
一种按类别执行 TOP-1 查询的可预测方法
如果要为每个ID
生成FNAME
和NAME
随机值,可以使用以下语法:
select id, max(fname), max(name)
from employee
group by id
请注意,这些值不一定来自同一行。 如果您希望它们来自同一行,则必须使用子查询或窗口函数来运行每个类别查询的TOP-1
PostgreSQL DISTINCT ON
请注意,PostgreSQL 为此支持DISTINCT ON
,它与ORDER BY
一起决定应该从每个“不同组”生成哪一行。 我觉得这很令人困惑,但为了完整起见,在这里提到了它。
为了记录起见, 我在这里也用更详细的方式回答了这个问题。
尽管如此,在结果查询中获取这些括号
如果出于某种原因,您选择不相信我,那么您始终可以使用带有 jOOQ 的普通 SQL并在结果查询中强制使用这些括号:
// Static import is implied
import static org.jooq.impl.DSL.*;
ctx.selectDistinct(
field("({0})", EMPLOYEE.ID.getDataType(), EMPLOYEE.ID),
EMPLOYEE.FNAME,
EMPLOYEE.NAME)
.from(EMPLOYEE)
.fetch();
输出现在将如您在问题中所要求的那样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.