下面的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中,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 BY
和FNAME
的随机值,则可以使用以下语法:
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
现在输出将按照您在问题中的要求。