Voici mon SQL:

SET @@global.sql_mode := replace(@@global.sql_mode, 'ONLY_FULL_GROUP_BY', '');
SELECT m.dept_no, m.emp_no, d.dept_name
FROM dept_manager_dup m
LEFT JOIN department_dup d ON m.dept_no = d.dept_no
GROUP BY m.emp_no
ORDER BY m.dept_no;

Et l'erreur est:

Code d'erreur: 1055. L'expression n ° 1 de la liste SELECT n'est pas dans la clause GROUP BY et contient la colonne non agrégée «employee.m.dept_no» qui n'est pas fonctionnellement dépendante des colonnes de la clause GROUP BY; ceci est incompatible avec sql_mode = only_full_group_by

-2
Saurabh Sharma 30 août 2020 à 03:56

2 réponses

Meilleure réponse

Vous devez utiliser des fonctions d'agrégation pour chaque colonne pas dans votre GROUP BY

SELECT m.dept_no, MIN(m.emp_no), MAX(d.dept_name)
FROM dept_manager_dup m
LEFT JOIN department_dup d ON m.dept_no = d.dept_no
GROUP BY m.emp_no
ORDER BY m.dept_no;

Il y a la possibilité de mettre toutes les colonnes dans le GROUP BY comme

SELECT m.dept_no, m.emp_no, d.dept_name
FROM dept_manager_dup m
LEFT JOIN department_dup d ON m.dept_no = d.dept_no
GROUP BY m.emp_no, m.emp_no, d.dept_name
ORDER BY m.dept_no;

Et une autre possibilité consiste à utiliser DISTINCT

SELECT DISTINCT m.dept_no, m.emp_no, d.dept_name
FROM dept_manager_dup m
LEFT JOIN department_dup d ON m.dept_no = d.dept_no
ORDER BY m.dept_no;

Bien sûr, cela dépend de votre résultat souhaité, de la fonction que vous pouvez utiliser, et parfois vous devez tout tester pour voir les résultats de la suite

0
nbk 30 août 2020 à 01:51

Vous devez agréger toutes les colonnes non répertoriées dans la clause group by.

Essayez quelque chose comme:

SELECT m.dept_no, m.emp_no, d.dept_name, count(*) as employee_count
FROM dept_manager_dup m
LEFT JOIN department_dup d ON m.dept_no = d.dept_no
GROUP BY m.dept_no, m.emp_no, d.dept_name
ORDER BY m.dept_no

Ou plus pratique, vous pouvez simplement coder:

GROUP BY 1, 2, 3
1
Bohemian 30 août 2020 à 01:28