Объединяйте запросы для выбора таблиц - PullRequest
0 голосов
/ 25 апреля 2019

Я только начал изучать Join в SQL.Я прошел различные онлайн и оффлайн уроки, чтобы понять это.Затем я начал задавать вопросы, чтобы понять, насколько я понимаю.Ниже приведены таблицы

Таблица разработчиков
1) ИД НОМЕР
2) ИМЯ VARCHAR2

Таблица клиентов
1) ID NUMBER
2) NAME VARCHAR2

Таблица проекта
1) ID NUMBER
2) CUSTOMER_ID NUMBER (NULL для внутренних проектов)
3) NAMEVARCHAR2 4) TYPE NUMBER (0 - Scrum, 1 - фиксированная цена, 2 - подтверждение концепции)
5) START_DATE DATE (NULL, когда еще не начато)
6) END_DATE DATE (NULL, когда еще не закончено)

Таблица задач
1) ID NUMBER
2) NAME VARCHAR2
3) PROJECT_ID NUMBER
4) TYPE NUMBER (0 - развертывание, 1 - поддержка,2 - Билет, 3 - Задача)
5) START_DATE DATE (NULL, когда еще не запущено)
6) END_DATE DATE (NULL, когда еще не закончено)

Таблица_телкок_ разработчика_1035 *
1) DEV_ID NUMBER
2) TASK_ID NUMBER


Теперь я хочу написать запрос на эти вопросы:

1) Какой разработчик потратил время на проект, который былна самом делеуже закончил и для какого клиента это было?
2) Сколько задач поддержки каждый разработчик выполнил в прошлом году для проектов Proof of Concept?
3) Какой разработчик еще не участвовал в проекте Scrum?

Соединениям нужен какой-то общий атрибут.Исходя из этого нам нужно написать запросы.Я не могу понять, как эти таблицы связаны и как писать запросы для них?

Ответы [ 3 ]

0 голосов
/ 25 апреля 2019

Что-то вроде:

1)

SELECT * FROM Developer D WHERE D.ID IN(
   SELECT DEV_ID FROM Developer_TASK DT 
   JOIN Tasks T ON DT.TASK_ID = T.ID 
   JOIN Project P ON P.ID = T.PROJECT_ID
   WHERE P.END_DATE > T.END_DATE
)

"Проверить с текущей датой" Уже завершенные проекты

SELECT * FROM Developer D WHERE D.ID IN(
   SELECT DEV_ID FROM Developer_TASK DT 
   JOIN Tasks T ON DT.TASK_ID = T.ID 
   JOIN Project P ON P.ID = T.PROJECT_ID
   WHERE P.END_DATE < GETDATE()
)

2)

SELECT DEV_ID, Name, COUNT(*) AS Entries FROM Developer D 
    JOIN Developer_Task DT ON D.ID = DT.DEV_ID 
    JOIN Tasks T ON TD.Task_ID = T.ID 
    GROUP BY DEV_ID, YEAR(T.START_DATE), Name

3)

SELECT * FROM Developer 
          WHERE DEV_ID NOT IN(SELECT DEV_ID FROM Developer_TASK DT 
                JOIN Tasks T ON DT.TASK_ID = T.ID 
                JOIN Project P ON P.ID = T.PROJECT_ID)
0 голосов
/ 26 апреля 2019

Какой разработчик потратил время на фактически завершенный проект и для какого клиента это был?

select p.id project_id, p.name project_name, d.name dev_name, 
       case p.customer_id when 0 then 'Internal' else c.name end cust_name
  from project p
    left join customer c on c.id = p.customer_id
    join task t on t.project_id = p.id
    join developer_task dt on dt.task_id = t.id
    join developer d on d.id = dt.dev_id
  where p.end_date is not null

Это основные объединения.p.end_date is not null отвечает за фильтрацию готовых проектов.Я не знаю, содержит ли таблица customer строку для внутреннего проекта, поэтому я использовал case construction и left join, чтобы не терять строки для таких проектов.

Сколько задач поддержки выполнял каждый разработчикв прошлом году для проектов Proof of Concept?

select id, name, nvl(cnt, 0) cnt
  from developer d
  left join (
    select dev_id, count(1) cnt
      from project p
        join task t on t.project_id = p.id
        join developer_task dt on dt.task_id = t.id
      where p.type = 2 
        and t.start_date <= trunc(sysdate, 'year') - 1 
        and (add_months(trunc(sysdate, 'year'), -12) <= t.end_date or t.end_date is null)
      group by dev_id) t on t.dev_id = d.id

Здесь я сгруппировал сначала количество задач для доказательства концептуальных проектов для каждого разработчика.Фильтрация дат несколько сложна, пожалуйста, внимательно изучите ее.Последним шагом было показать данные для всех разработчиков, поэтому я использовал left join, чтобы показать все, даже если они не участвовали в таких проектах.Их количество = 0.

Какой разработчик еще не участвовал в проекте Scrum?

select * 
  from developer 
  where id not in (
    select dev_id 
      from project p 
      join task t on t.project_id = p.id 
      join developer_task dt on dt.task_id = t.id
      where p.type = 0)

Найти dev_id для всех проектов Scrum.Затем используйте not in.Вы также можете использовать not exists, minus, аналитические count.Oracle часто позволяет выполнять задачу несколькими способами.


Вот демоверсия dbfiddle со всеми рабочими запросами и примерами данных, которые я себе представлял, чтобы иметь материал для проверки правильности синтаксиса и, еслирезультаты выглядят хорошо.

0 голосов
/ 25 апреля 2019

Если вы хотите узнать эти вопросы, сначала вам нужно добавить внешний ключ разработчика в Таблица проекта .
Затем вы сможете узнать действия разработчика в таблице проекта.
Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...