Sqlite

Group by + Order by 行為解釋?

  • September 18, 2014

假設我有:

產品(_id,名稱)

提供者(_id,名稱)

提供(ProductIdProviderId,價格)

如果我想獲得銷售最昂貴產品且名稱以 A 開頭的供應商

  • 你能告訴我下面的程式碼片段是如何執行的嗎?它似乎正在返回我要求的結果。
  • group by 是否從表中獲取隨機記錄?
  • Order by 首先工作,然後 Group by 獲得第一條記錄嗎?
選擇 provider.Name、piece.Name、provides.Price
FROM provider,piece,提供
WHERE provider._id = 提供者.ProviderId
AND piece._id = 提供.PieceId
AND provider.Name LIKE 'A%'
按件分組。名稱
ORDER BY 提供.Price DESC

***Edit1:如果這個查詢的方式,我的問題(粗體文本)***得到了回答,我仍然沒有得到回答。我也在詢問應用 Group by 後會發生什麼。請參閱我正在嘗試根據價格訂購。我不是在問基本的想法,而是在問背後發生了什麼。我得到了回答“不”。那麼在 Group by 和 Order by 工作的背後發生了什麼?

**Edit2:**似乎問題有點含糊:為了澄清,最初的問題意味著:

對於每一種產品,我都希望銷售最昂貴的供應商。

那麼你們能建議使用標準 SQL 的解決方案嗎?我的想法以及給我正確的結果的結果是: 幕後似乎發生了什麼

那麼,有誰知道為什麼group by不會在內部保持記錄“分組”,然後按順序排序?而是顯示任意記錄?(對於這個問題,我想到的解決方案是不可信/不可預測的)。

(這變得有點長成為評論)

正如 Miracle173 所說,這不是標準 SQL,因為SELECT子句中的欄位既不在聚合函式中也不在GROUP BY聚合函式中,這意味著它們的值是未定義的:對於任何給定piece.Name的價格和提供者,只有空間最多輸出一個。這意味著數據庫引擎必須任意選擇一個。它可能是第一個ORDER BY,但如果有兩個供應商以相同的價格提供相同的產品呢?

如果它任意選擇進入這些值的內容(如果它不只是錯誤則必須如此),那麼輸出是不穩定的:它可能會在下一次任意選擇其他內容,因為它會隨著數據的增長選擇不同的查詢計劃。

因此,對於您的總體問題“這是如何工作的?” 我的回答是“它不應該……”。

引用自:https://dba.stackexchange.com/questions/76640