Написание запроса с заданными очень нормализованными таблицами - был задан во время интервью.

Мне задали этот вопрос во время интервью с одной из ведущих ИТ-отраслей, и я понятия не имел. Кто-нибудь может сказать мне, как? Либо Mysql, либо Oracle в порядке, но я привожу пример с mysql.

CREATE TABLE employee (employee_ID VARCHAR(5), manager_ID VARCHAR(5));

CREATE TABLE meeting (meeting_ID VARCHAR(1), meeting_title VARCHAR(100));

CREATE TABLE attendee (meeting_ID VARCHAR(1), employee_ID VARCHAR(5));

Отношения довольно прямо вперед с примером. Я думаю, что это в значительной степени нормализованный пример до 3-й нормальной формы. Участник связывает встречу и участвующего сотрудника, включая сотрудников и менеджеров.

Вопрос заключался в том, чтобы написать запрос, который узнаёт, какие встречи посещают и сотрудник, и его менеджер.


person user3034116    schedule 25.11.2013    source источник
comment
Возможно, это был тест, чтобы увидеть, прокомментируете ли вы их совершенно безумный выбор типов данных для столбцов идентификаторов.   -  person David Aldridge    schedule 26.11.2013
comment
Хотя я согласен, я видел такие вещи в реальной жизни, к сожалению.   -  person user2366842    schedule 26.11.2013
comment
Интересно, сколько встреч они собираются провести вообще? Имейте в виду, что если используется семантика длины CHAR, я думаю, что VARCHAR2(1) может хранить до 4 294 967 296 различных значений.   -  person Jeffrey Kemp    schedule 26.11.2013


Ответы (3)


Что-то вроде этого будет работать:

SELECT m.*
FROM meeting m 
INNER JOIN attendee a a.meeting_ID = m.meeting_ID
INNER JOIN employee e ON e.employee_ID = a.employee_ID
WHERE (a.meeting_ID,e.manager_ID) IN (SELECT meeting_ID,employee_ID FROM antendee)

или (наверное лучше)

SELECT m.*
FROM meeting m 
INNER JOIN attendee a a.meeting_ID = m.meeting_ID
INNER JOIN employee e ON e.employee_ID = a.employee_ID
INNER JOIN attendee am ON am.employee_ID = e.manager_ID AND am.meeting_ID = a.meeting_ID
person Andrei B    schedule 25.11.2013
comment
Спасибо Андрей. Оба работают, вероятно, последний более эффективен. - person user3034116; 26.11.2013

Если вам просто нужны названия встреч, вы можете использовать этот запрос:

SELECT DISTINCT meeting.meeting_title
FROM
  attendee a1 INNER JOIN employee e ON a1.employee_ID=e.employee_ID
  INNER JOIN attendee a2 ON e.manager_ID=a2.employee_ID
  INNER JOIN meeting ON a1.meeting_ID = meeting.meeting_ID
WHERE
  a1.meeting_ID=a2.meeting_ID
person fthiella    schedule 25.11.2013

Попробуйте это, собрание, на котором присутствуют a и b, и b является менеджером a

SELECT m.*
FROM meeting m 
    JOIN attendee a a.meeting_ID = m.meeting_ID
    JOIN attendee b b.meeting_ID = m.meeting_ID AND a.employee_ID <> b.employee_ID
    JOIN employee e ON e.employee_ID = a.employee_ID AND e.manager_ID = b.employee_ID
person user2989408    schedule 25.11.2013