下面的SQL查询格式在MySQL中运行良好
select distinct(emp.id), emp.fname, emp.name from employee emp;在jOOQ中,我们可以在查询中使用.selectDistinct,也可以选择字段,但无法执行上述操作。
如果我确实选择了distinct(所有字段),那么JOOQ工作得很好。但是,它在所有列中都是不同的,例如distinct(emp.id)、distinct(emp.fname)、distinct(emp.name)
它是JOOQ中的一个bug,还是可以以相同的方式执行,或者将每个列的不同之处放在单独的一个列上,从而具有相同的性能?
请给我建议。
发布于 2020-02-29 08:21:37
你认为你只在一列上应用了“不同的函数”,但这不是你要做的。您只是插入了您的第一列,就像您可以对所有其他列所做的那样,即使没有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的一部分,从语法上来说,它也不是。我还在这篇关于是相关的的博客文章中解释了这一点,这是另一个在SQL中引起混淆的流行原因。
一种可预测的方式来执行每个类别的顶级查询()
如果要为每个FNAME和NAME的每个ID生成随机值,可以使用以下语法:
select id, max(fname), max(name)
from employee
group by id注意,这些值不一定来自同一行。如果希望它们来自同一行,则必须使用子查询或窗口函数来运行顶-1每个类别查询
DISTINCT ON PostgreSQL
请注意,PostgreSQL为此目的支持DISTINCT ON,它与ORDER BY一起决定应从每个“不同的组”生成哪一行。我觉得这很令人困惑,但为了完整起见,我在这里提到了这一点。
作为记录,我在这里也回答了这个问题。。
在结果查询中得到那些括号,尽管如此,
如果出于某种原因,您选择不相信我,那么始终可以使用普通SQL和jOOQ,并在结果查询中强制使用这些括号:
// 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();输出将按照您在问题中的要求进行。
https://stackoverflow.com/questions/60451147
复制相似问题