2016-11-21 5 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, который ввел нарушенную реализацию' group by' в MySQL –

+1

Thx для информации! Я узнаю еще одну вещь сегодня! – yaylitzis

Смежные вопросы