Форум Академгородка, Новосибирск > проверьте sql-запросы, пожалуйста
Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проверьте sql-запросы, пожалуйста
Форум Академгородка, Новосибирск > Компьютеры и сети > Программирование
bolkunovaes
Привет всем, только начала изучать 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);
Tonal
Все ответы не верны.
В первом и втором случае у Вас нет «названий подразделений» которые требуются в заданиях.
В третьем случае вы делаете необоснованное предположение об именах подразделений.

Кроме того, либо вы допустили ошибку при прочтении и перепечатке заданий, либо она была в исходнике: по смыслу каждая таблица имеет 3 колонки.
Для таблицы подразделений ORGANIZATION - это:
* ORG_ID - уникальный ID подразделения (первичный ключ)
* PARENT_ID - ID головного подразделения (вторичный ключ)
* NAME - наименование организации
Для таблицы сотрудников PERSON - это:
* PERSON_ID - уникальный ID сотрудника (первичный ключ)
* NAME - Имя сотрудника
* ORG_ID - ID подразделения в котором работает сотрудник (вторичный ключ)
Антип Од
GROUP BY тут никчему, эта задача на умение применять JOIN. Задача решается одним запросом к двум таблицам. Штоб на пятерочку, добавьте ORDER BY - список получится красивее. Если уж совсем красиво, можно использовать LEFT OUTER JOIN, тогда в список попадут и те сотрудники, для которых почему-либо не найдена соответствующая запись в списке подразделений. Такой код при прочих равных надежнее, по крайней мере, нарушение ссылочной целостности будет налицо.
Антип Од
Поторопился, во второй задаче, конечно GROUP BY, делается она на основе решения первой
Антип Од
И, да, для того, чтоб решить вторую задачу, если количество нужно не только для подразделений низшего уровня, а для всех подразделений, требуется объединение таблицы подразделений не только с таблицей сотрудников, но и с самой собой несколько раз. И прочие красивости. Вы пишете о себе в женском роде, ИМХО, морочить такими задачами девушек нехорошо, да простят меня феминистки.
Dimitri435
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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2024 IPS, Inc.