简体   繁体   English

联接查询以选择表

[英]Join queries to select tables

I just started learning about Join in SQL. 我刚刚开始学习Join in SQL。 I have gone through various online and offline tutorial to understand it. 我已经阅读了各种在线和离线教程以了解它。 Then I started doing some questions to find out how much I understand. 然后我开始做一些问题,以了解我的理解。 Below are the tables 下表

Developer Table 开发人员表
1) ID NUMBER 1)ID号
2) NAME VARCHAR2 2)NAME VARCHAR2

Customer table 客户表
1)ID NUMBER 1)编号
2)NAME VARCHAR2 2)NAME VARCHAR2

Project Table 项目表
1)ID NUMBER 1)编号
2)CUSTOMER_ID NUMBER (NULL for internal projects) 2)CUSTOMER_ID NUMBER(内部项目为NULL)
3)NAME VARCHAR2 4)TYPE NUMBER (0 - Scrum, 1 - Fixed price, 2 - Proof of Concept) 3)NAME VARCHAR2 4)类型编号(0-Scrum,1-固定价格,2-概念证明)
5)START_DATE DATE (NULL when not started yet) 5)START_DATE DATE(如果尚未开始,则为NULL)
6)END_DATE DATE (NULL when not finished yet) 6)END_DATE DATE(如果尚未完成,则为NULL)

Task Table 任务表
1) ID NUMBER 1)ID号
2)NAME VARCHAR2 2)NAME VARCHAR2
3)PROJECT_ID NUMBER 3)PROJECT_ID NUMBER
4)TYPE NUMBER (0 - Deployment, 1 - Support, 2 - Ticket, 3 – Task) 4)TYPE NUMBER(0-部署,1-支持,2-工单,3-任务)
5)START_DATE DATE (NULL when not started yet) 5)START_DATE DATE(如果尚未开始,则为NULL)
6)END_DATE DATE (NULL when not finished yet) 6)END_DATE DATE(如果尚未完成,则为NULL)

Developer_Task Table Developer_Task表
1) DEV_ID NUMBER 1)DEV_ID NUMBER
2)TASK_ID NUMBER 2)TASK_ID NUMBER


Now i want to write query for these question: 现在我想为这些问题写查询:

1)Which developer spent time on a project that was actually already finished and for which customer was it? 1)哪个开发人员花了时间在一个实际上已经完成的项目上,并且是为哪个客户服务的?
2)How many support tasks did each developer work on last year for Proof of Concept projects? 2)每个开发人员去年为概念证明项目从事过多少支持任务?
3)Which developer did not participate on a Scrum project yet? 3)哪个开发人员尚未参与Scrum项目?

Joins need some common attribute. 连接需要一些共同的属性。 Based on that we need to write queries. 基于此,我们需要编写查询。 I am not able to understand how these tables are related and how to write queries for these? 我无法理解这些表之间的关系以及如何为这些表编写查询?

Something like: 就像是:

1) 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
)

"Check with current datetime" Already ended projects “检查当前日期时间”已经结束的项目

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) 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) 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)

Which developer spent time on a project that was actually already finished and for which customer was it? 哪个开发人员花了时间在实际上已经完成的项目上,以及该客户是谁?

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

These are basic joins. 这些是基本联接。 p.end_date is not null is responsible for filtering finished projects. p.end_date is not null负责过滤完成的项目。 I do not know if customer table contains row for internal project so I used case construction and left join to not lose rows for such projects. 我不知道customer表是否包含用于内部项目的行,因此我使用了case构建和left join来不丢失此类项目的行。

How many support tasks did each developer work on last year for Proof of Concept projects? 每个开发人员去年为概念验证项目完成了多少支持任务?

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

Here I grouped at first number of tasks for proof of concept projects for each developer. 在这里,我按任务的数量对每个开发人员的概念验证项目进行了分组。 Date filtering is somewhat tricky, please study it carefully. 日期过滤有些棘手,请仔细研究。 Last step was to show data for all developers so I used left join to show all, even if they did not participate in such projects. 最后一步是显示所有开发人员的数据,因此即使他们未参与此类项目,我也使用left join显示全部。 They have count = 0. 它们的计数= 0。

Which developer did not participate on a Scrum project yet? 哪个开发人员尚未参与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)

Find dev_id for all Scrum projects. 查找所有Scrum项目的dev_id。 Then use not in . 然后使用not in You can also use not exists , minus , analytical count . 您还可以使用not existsminus ,分析count Oracle often allows to do task in several ways. Oracle通常允许以多种方式执行任务。


Here is the dbfiddle demo with all working queries and sample data I imagined to have material to check if syntax is correct and if results looks OK. 这是dbfiddle演示,其中包含所有有效的查询和示例数据,我认为它们可以用来检查语法是否正确以及结果是否正常。

If you want to know those questions you first will need to add a Developer foreign key in Project table . 如果您想知道这些问题,首先需要在Project表中添加一个Developer外键。
Then, you will be able to know Developer actions in Project table. 然后,您将能够知道Project表中的Developer动作。
Greetings 问候

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM