簡體   English   中英

與選擇幾列不同在 JOOQ 與 MySQL 中不起作用

[英]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一部分,在語法上,它也不是。 我還在這篇關於DISTINCTORDER BY是如何相關的博客文章中解釋了這一點,這是 SQL 中另一個常見的混淆來源。

一種按類別執行 TOP-1 查詢的可預測方法

如果要為每個ID生成FNAMENAME隨機值,可以使用以下語法:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM