2016-11-21 148 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