簡體   English   中英

MySQL違反SQL標准

[英]MySQL violating SQL standard

這篇關於ANSI SQL 99 standard requirement group by文章中,他們說:

該語句的 select 列表可能僅包含對每組單值列的引用——這意味着 select 列表不能包含對未包含在 GROUP BY 子句中的臨時結果列的引用

但是在 MySQL 中我們可以這樣做:

select b
from a
group by c

而且它沒有抱怨,所以我想知道這是否被視為違反標准。

我已經閱讀了關於這個主題的答案,但我想知道這是否是違規行為,或者可以被視為違規行為(假設有一個例子說“嚴格遵守 SQL 標准”,我寫道結果),而不是它為什么有效或其他原因。

我最初誤解了這個問題。

MySQL 不再支持:

select b
from a
group by c;

(至少使用默認設置)。 耶。 這會像它應該的那樣返回一個錯誤,就像它在幾乎所有其他數據庫中所做的那樣(我認為 SQLite 可能是現在最后的保留)。

這違反了標准——通常(見下文)。 問題是每個c值返回一行。 GROUP BY 中除c以外的任何內容都應作為GROUP BY GROUP BY的參數。

有一種情況允許這樣做。 c是 a 中a主鍵或唯一鍵(技術上稱為“功能相關”)。 在這種情況下,您可以 select 表中的其他列而不使用聚合函數。 Postgres 是支持此功能的數據庫之一。

如果你想要b每個c的一個值,那么規范的解決方案是這樣的:

select max(b)
from a
group by c;

Postgres 還提供了distinct on which 允許更大的靈活性:

select distinct on (c) b
from a
order by c, random();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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