bolkunovaes
03.04.2013, 16:36
Привет всем, только начала изучать SQL. Вот три задания которые нужно решить. Проверьте меня, пожалуйста. Правильно ли я написала решение? Исходные данные:
Таблица ORGANIZATION - "Подразделение"
имеет колонки ORG_ID и PARENT_ID NAME
Таблица PERSON - "Сотрудник"
имеет колонки PERSON_ID, NAME ORG_ID
1. написать sql-запрос, формирующий список сотрудников с указанием названий подразделений, в которых они работают
2. написать sql-запрос, формирующий список названий подразделений с указанием количества сотрудников, которые в них работают
3. в предположении, что структура подразделений трехуровневая написать sql-запрос, формирующий таблицу из трех колонок: подразделение третьего уровня, подразделение второго уровня, подразделение первого уровня
Решение:
1. SELECT PERSON_ID, NAME ORG_ID
FROM PERSON
GROUP BY PERSON_ID;
2.
SELECT NAME ORG_ID, COUNT(PERSON_ID) AS [Количество сотрудников]
FROM PERSON
GROUP BY NAME ORG_ID;
3. Я предположила что подразделение третьего уровня, это когда `PARENT_ID NAME` =2. аналогично подразделение второго уровня `PARENT_ID NAME` =1, подразделение первого уровня `PARENT_ID NAME` =0
CREATE TABLE TABLE1 (
column1 INT(1) NOT NULL,
column2 INT(1) NOT NULL,
column3 INT(1)
) TYPE=MyISAM;
INSERT INTO Table1 (column1)
(SELECT ORG_ID FROM ORGANIZATION WHERE `PARENT_ID NAME` =2)
INSERT INTO Table1 (column2)
(SELECT ORG_ID FROM ORGANIZATION WHERE `PARENT_ID NAME` =1)
INSERT INTO Table1 (column3)
(SELECT ORG_ID FROM ORGANIZATION WHERE `PARENT_ID NAME` =0);
Все ответы не верны.
В первом и втором случае у Вас нет «названий подразделений» которые требуются в заданиях.
В третьем случае вы делаете необоснованное предположение об именах подразделений.
Кроме того, либо вы допустили ошибку при прочтении и перепечатке заданий, либо она была в исходнике: по смыслу каждая таблица имеет 3 колонки.
Для таблицы подразделений ORGANIZATION - это:
* ORG_ID - уникальный ID подразделения (первичный ключ)
* PARENT_ID - ID головного подразделения (вторичный ключ)
* NAME - наименование организации
Для таблицы сотрудников PERSON - это:
* PERSON_ID - уникальный ID сотрудника (первичный ключ)
* NAME - Имя сотрудника
* ORG_ID - ID подразделения в котором работает сотрудник (вторичный ключ)
Антип Од
08.04.2013, 15:54
GROUP BY тут никчему, эта задача на умение применять JOIN. Задача решается одним запросом к двум таблицам. Штоб на пятерочку, добавьте ORDER BY - список получится красивее. Если уж совсем красиво, можно использовать LEFT OUTER JOIN, тогда в список попадут и те сотрудники, для которых почему-либо не найдена соответствующая запись в списке подразделений. Такой код при прочих равных надежнее, по крайней мере, нарушение ссылочной целостности будет налицо.
Антип Од
08.04.2013, 16:02
Поторопился, во второй задаче, конечно GROUP BY, делается она на основе решения первой
Антип Од
08.04.2013, 16:19
И, да, для того, чтоб решить вторую задачу, если количество нужно не только для подразделений низшего уровня, а для всех подразделений, требуется объединение таблицы подразделений не только с таблицей сотрудников, но и с самой собой несколько раз. И прочие красивости. Вы пишете о себе в женском роде, ИМХО, морочить такими задачами девушек нехорошо, да простят меня феминистки.
Dimitri435
04.05.2014, 19:32
1.
Код
SELECT p.name, o.name
FROM person AS p
INNER JOIN organization AS o ON p.org_id = o.org_id
ORDER BY o.name
2.
Код
SELECT o.name, COUNT(p.person_id) AS persons_quantity
FROM person AS p
INNER JOIN organization AS o ON p.org_id = o.org_id
GROUP BY o.org_id
ORDER BY o.name
3.
Код
SELECT IF (o.parent_id IS NULL, o.name, '') AS first_level_organization,
IF ((o.parent_id IS NOT NULL) AND (o2.parent_id IS NULL), o.name, '') AS second_level_organization,
IF ((o.parent_id IS NOT NULL) AND (o2.parent_id IS NOT NULL), o.name, '') AS third_level_organization
FROM organization AS o
LEFT JOIN organization AS o2 ON o.parent_id = o2.org_id
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.