#sql
Вопрос:
Кто-нибудь может помочь мне с этой ошибкой?
Информация о базе данных:
CREATE DATABASE School;
Используется School
для создания первой таблицы:
CREATE TABLE Classes
(
class_id INT,
name Varchar(45),
dept Char(4),
number CHAR(4),
section Char(2),
location Varchar(45),
meeting_time varchar(45),
PRIMARY KEY(class_id)
);
INSERT INTO Classes
VALUES (000001, 'Intro. to databases', 'info', '1620', '1a', 'sarpy214', 'm/w 1-2:45 pm');
INSERT INTO Classes (class_id, name, dept, number, section, location)
VALUES (000002, 'intro. to sql', 'info', '2630', 'ww', 'online');
INSERT INTO Classes
VALUES (000003, 'Software Engineering I', 'info', '1325', '4c', 'socmahoney205', 't/h 10-11:45 pm');
INSERT INTO Classes (class_id, name, dept, number, section, location)
VALUES (000004, 'Software Engineering II', 'info', '1335', 'ww', 'online');
INSERT INTO Classes
VALUES (000005, 'How to leave the shire amp; live forever', 'ring', '1001', '1r', 'socmahoney214', 'f 10-11:45 am');
INSERT INTO Classes (class_id, name, dept, number, section, location)
VALUES (000006, 'Living with the demon inside', 'psyc', '1668', 'ww', 'online');
INSERT INTO Classes
VALUES (000007, 'Internet Scripting jedi mastery', 'info', '2430', '2b', 'socmahoney205', 'm/w 10-11:45 am');
UPDATE Classes
SET meeting_time = 't/h 10-11:45 am'
WHERE class_id = 000003;
SELECT * FROM Classes;
Теперь создайте 2-ю таблицу:
CREATE TABLE Enrol
(
stu_id int,
class_id int,
grade char(1),
PRIMARY KEY (stu_id),
FOREIGN KEY (stu_id) REFERENCES Students(Stu_id),
FOREIGN KEY (class_id) REFERENCES Classes(class_id)
);
INSERT INTO Enrol VALUES (0000001, 000002, 'A');
INSERT INTO Enrol (stu_id, class_id) VALUES (0000002, 000002);
INSERT INTO Enrol VALUES (0000005, 000001, 'D');
INSERT INTO Enrol (stu_id, class_id) VALUES (0000006, 000005);
INSERT INTO Enrol VALUES (0000003, 000006, 'C');
SELECT * FROM Enrol;
Создать 3-ю таблицу:
CREATE TABLE Students
(
Stu_id INT PRIMARY KEY,
fname VARCHAR(45),
lname VARCHAR(45),
area_code CHAR(3),
phone VARCHAR(8)
);
INSERT INTO Students
VALUES (000001, 'patty', 'melt', '402', '234-9876');
INSERT INTO Students
VALUES (000002, 'bill', 'fold', '402', '531-6222');
INSERT INTO Students
VALUES (000003, 'sam', 'winchester', '402', '234-2346');
INSERT INTO Students
VALUES (000004, 'luke', 'skywalker', '402', '543-1234');
INSERT INTO Students
VALUES (000005, 'charlie', 'kelly', '402', '234-6859');
INSERT INTO Students
VALUES (000006, 'bilbo', 'baggins', '531', '646-3828');
SELECT * FROM Students
Комментарии:
1. Вместо публикации изображений сообщество рекомендует вместо этого ввести запрос о проблеме и сообщение об ошибке непосредственно в свой вопрос для лучшей читаемости вопроса
2. markheath.net/post/effective-debugging-with-divide-and-conquer
Ответ №1:
проблема в том, что вы использовали агрегированную функцию и в группу по вам нужно поместить все неагрегированные функции
поэтому добавьте в группу по GROUP BY S.STU_ID, S.FNAME, S.LNAME;
Ответ №2:
«Ошибка» является незначительной, и несколько СУБД даже проигнорируют ее.
Видите ли, если у вас есть такой кортеж , как (ID, FNAME)
, очевидно, что каждый идентификатор сопоставляется со своим собственным именем FNAME. Иначе и быть не может. Таким образом, группировка по идентификатору или группировка по идентификатору и имени F-это одно и то же.
Хотя, с другой стороны, в сложном СОЕДИНЕНИИ у вас могут быть разные значения третьего столбца из другой таблицы для одного и того же значения идентификатора; в этом случае вы не можете ВЫБРАТЬ и идентификатор, и этот третий столбец при группировке по идентификатору, потому что у системы не будет достаточно информации, чтобы решить, какие из возможных различных значений третьего столбца должны соответствовать каждому идентификатору. В этом случае, чтобы решить затруднительное положение, вам нужно добавить этот третий столбец в ГРУППУ BY, тем самым увеличив количество идентификаторов в ответе: теперь у вас может быть 1, ДЖОН СМИТ, ЖЕЛТЫЙ и 1, ДЖОН СМИТ, КРАСНЫЙ.
Здесь ваш ВЫБОР относится к первому типу, но ядро базы данных не осознает этого или не заботится об этом и настаивает на том, чтобы вы указали полную ГРУППУ со всеми полями в выборе, даже если одно из них является первичным ключом, а другие находятся в одной таблице.
Так,
GROUP BY S.STU_ID, S.FNAME, S.LNAME