首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JOOQ中,有几个列不起作用

在JOOQ中,有几个列不起作用
EN

Stack Overflow用户
提问于 2020-02-28 11:50:58
回答 1查看 988关注 0票数 2

下面的SQL查询格式在MySQL中运行良好

代码语言:javascript
复制
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,还是可以以相同的方式执行,或者将每个列的不同之处放在单独的一个列上,从而具有相同的性能?

请给我建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-29 08:21:37

你认为你只在一列上应用了“不同的函数”,但这不是你要做的。您只是插入了您的第一列,就像您可以对所有其他列所做的那样,即使没有distinct

代码语言:javascript
复制
select (emp.id), (emp.fname), (((emp.name))) from employee emp;

即使在MySQL,它也没有作用。DISTINCT子句仅适用于一列意味着什么?您会为其他列设计什么值?随机的?例如:

代码语言:javascript
复制
+----+-------+------+
| ID | FNAME | NAME |
+----+-------+------+
|  1 | A     | A    |
|  1 | B     | B    |
+----+-------+------+

您的期望是只生成第一行还是只生成第二行?

SQL操作的逻辑顺序

注意,在SQL中,对于语句(假设语法),操作的逻辑顺序是:

代码语言:javascript
复制
from employee
select id, fname, name
distinct

换句话说,DISTINCT操作“发生在”整个SELECT操作或投影之后。即使它似乎是SELECT的一部分,从语法上来说,它也不是。我还在这篇关于是相关的的博客文章中解释了这一点,这是另一个在SQL中引起混淆的流行原因。

一种可预测的方式来执行每个类别的顶级查询()

如果要为每个FNAMENAME的每个ID生成随机值,可以使用以下语法:

代码语言:javascript
复制
select id, max(fname), max(name)
from employee
group by id

注意,这些值不一定来自同一行。如果希望它们来自同一行,则必须使用子查询或窗口函数来运行顶-1每个类别查询

DISTINCT ON PostgreSQL

请注意,PostgreSQL为此目的支持DISTINCT ON,它与ORDER BY一起决定应从每个“不同的组”生成哪一行。我觉得这很令人困惑,但为了完整起见,我在这里提到了这一点。

作为记录,我在这里也回答了这个问题。

在结果查询中得到那些括号,尽管如此,

如果出于某种原因,您选择不相信我,那么始终可以使用普通SQL和jOOQ,并在结果查询中强制使用这些括号:

代码语言:javascript
复制
// 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();

输出将按照您在问题中的要求进行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60451147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档