Sqlite
Group by + Order by 行為解釋?
假設我有:
產品(_id,名稱)
提供者(_id,名稱)
提供(ProductId,ProviderId,價格)
如果我想獲得銷售最昂貴產品且名稱以 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
,但如果有兩個供應商以相同的價格提供相同的產品呢?如果它任意選擇進入這些值的內容(如果它不只是錯誤則必須如此),那麼輸出是不穩定的:它可能會在下一次任意選擇其他內容,因為它會隨著數據的增長選擇不同的查詢計劃。
因此,對於您的總體問題“這是如何工作的?” 我的回答是“它不應該……”。