2016-11-21 147 views
0

我在我的數據庫中執行這2個查詢。第一個返回1條記錄,第二個返回2241條(如我所料)。我用兩種不同的方式詢問同樣的事情。在第一個中,我使用DISTINCT,在第二個中我使用「GROUP BY」。這不一樣嗎?與DISTINCT和GROUP BY不同的結果

/*returns 1 record*/ 
SELECT DISTINCT INVENTORY.location, INVENTORY.label, INVENTORY.version, SUM(INVENTORY.quantity) AS total, LABELS.description, LABELS.customer , LABELS.label 
FROM INVENTORY 
INNER JOIN LABELS 
ON INVENTORY.label = LABELS.label 
AND INVENTORY.version = LABELS.version 
WHERE INVENTORY.location = 1 

/*returns 2241 record*/ 
SELECT Inventory.location, Inventory.label, Inventory.version, SUM(INVENTORY.quantity) AS total, Labels.description, Labels.customer, LABELS.label 
FROM Inventory 
INNER JOIN LABELS 
ON Inventory.label = Labels.label 
AND Inventory.version = Labels.version 
WHERE Inventory.location = 1 
GROUP BY Inventory.label, Inventory.Version 
+4

實際上:兩者都是無效的SQL第一個完全缺少所需的「group by」,第二個沒有對所有非聚合列進行分組。我很驚訝,SQLite甚至接受這一點。 –

+0

我沒有得到任何錯誤...! – yaylitzis

+0

@a_horse_with_no_name自從DISTINCT需要GROUP BY時? – m0skit0

回答

1

根據ANSI SQL,您的查詢都無效,但這並不能阻止Oracle釋放MySQL,也不會阻止您編寫這些查詢。這裏是你嘗試了兩個查詢的有效版本:

這裏
SELECT Inventory.location, 
     Inventory.label, 
     Inventory.version, 
     SUM(INVENTORY.quantity) AS total, 
     Labels.description, 
     Labels.customer, 
     LABELS.label 
FROM Inventory 
INNER JOIN LABELS 
    ON Inventory.label = Labels.label AND 
     Inventory.version = Labels.version 
WHERE Inventory.location = 1 
GROUP BY Inventory.location, 
     Inventory.label, 
     Inventory.version, 
     Labels.description, 
     Labels.customer, 
     LABELS.label 

的關鍵點是,每一個出現的SELECT子句中的列要麼也出現了GROUP BY條款出現一個聚集函數裏面,如SUM

您的查詢在SQLite上運行,因爲它與MySQL嚴格對查詢不嚴格兼容。

+1

公平地說:這不是Oracle在MySQL –

+1

Thx中引入了破壞的'group by'實現的信息!今天我又學到了一件事! – yaylitzis