仅有少数几列的区别在JOOQ与MySQL中不起作用

问题描述 投票:1回答:1

下面的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中的错误,还是可能以相同的方式执行,或者在每个单独的列中放置不同的代码,对于一个单独的列而言,具有相同的性能就可以了

请告知。

谢谢。

java mysql sql jooq
1个回答
1
投票

您以为您仅在一个列上应用了“独特的功能”,但这不是您要执行的操作。您只是将第一列括起来,就像其他所有列一样,甚至没有distinct

select (emp.id), (emp.fname), (((emp.name))) from employee emp;

即使在MySQL中也没有作用。 DISTINCT子句仅适用于一列甚至意味着什么?您将为其他列预测什么值?一个随机的?例如:

+----+-------+------+
| ID | FNAME | NAME |
+----+-------+------+
|  1 | A     | A    |
|  1 | B     | B    |
+----+-------+------+

您期望只产生第一行还是仅产生第二行?

SQL操作的逻辑顺序

注意,在SQL中,the logical order of operations用于您的语句(以假定的语法:]

from employee
select id, fname, name
distinct

换句话说,DISTINCT操作在整个SELECT操作或投影之后“发生”。从句法上来说,即使它似乎是SELECT的一部分,也不是。我还在本博客中有关how DISTINCT and ORDER BY are related的内容中对此进行了解释,这是SQL中另一个引起混乱的流行原因。

每个类别查询执行TOP-1的可预测方式

如果要为每个DISTINCT生成ORDER BYFNAME的随机值,则可以使用以下语法:

NAME

请注意,这些值不一定来自同一行。如果希望它们来自同一行,则必须使用子查询或窗口函数来运行ID

PostgreSQL select id, max(fname), max(name) from employee group by id

请注意,PostgreSQL为此目的支持TOP-1 per category query,它与DISTINCT ON一起决定应该从每个“不同的组”中产生哪一行。我觉得这很令人困惑,但是为了完整起见,在这里提到了它。

作为记录,DISTINCT ON

仍然在结果查询中获得那些括号

[如果由于某种原因而选择不相信我,那么您总是可以在jOOQ上使用ORDER BY并在结果查询中强加那些括号:

I've answered this question also with a bit more detail here

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

© www.soinside.com 2019 - 2024. All rights reserved.