【问题标题】:Join queries to select tables加入查询以选择表
【发布时间】:2019-04-25 15:18:13
【问题描述】:

我刚开始学习 SQL 中的 Join。我已经通过各种在线和离线教程来理解它。然后我开始做一些问题,以了解我了解多少。 以下是表格

开发者表
1) 身份证号码
2) NAME VARCHAR2

客户表
1)身份证号码
2)NAME VARCHAR2

项目表
1)身份证号码
2)CUSTOMER_ID NUMBER(内部项目为空)
3)NAME VARCHAR2 4)类型编号(0 - Scrum,1 - 固定价格,2 - 概念证明)
5)START_DATE DATE(尚未开始时为空)
6)END_DATE DATE(未完成时为空)

任务表
1) 身份证号码
2)NAME VARCHAR2
3)PROJECT_ID 编号
4)类型编号(0 - 部署,1 - 支持,2 - 票证,3 - 任务)
5)START_DATE DATE(尚未开始时为空)
6)END_DATE DATE(未完成时为空)

Developer_Task 表
1) DEV_ID 编号
2)TASK_ID NUMBER


现在我想为这些问题编写查询:

1) 哪个开发人员在一个实际上已经完成的项目上花费了时间,它是为哪个客户服务的?
2)每个开发人员去年为概念验证项目完成了多少支持任务?
3) 哪个开发人员尚未参与 Scrum 项目?

连接需要一些共同的属性。基于此,我们需要编写查询。我无法理解这些表之间的关系以及如何为这些表编写查询?

【问题讨论】:

  • 你的表信息没有列出表之间的外键/关系吗?但是,查看您的表格和列,猜测它们可能是什么并不难 - 例如。您在 CUSTOMER 表中有一个 ID 列,在 PROJECTS 表中有一个 CUSTOMER_ID 列;这些似乎他们之间有关系。
  • 如何获取负值意味着没有参与第三次查询的值?
  • 你可以使用 MINUS 或外连接。
  • 对于“哪个开发人员还没有参与 Scrum 项目?”
  • 是的。您将 scrum 任务外部连接到开发人员表并找到具有空任务 ID 的任务,或者您列出开发人员 ID 并减去 scrum 任务开发人员 ID。取决于您希望在最终输出中显示的信息 - 您只需要开发人员 ID 吗?如果是这样,可能 MINUS 是最好的,否则外部连接。或者甚至可能是where not exists ...

标签: sql oracle


【解决方案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
)

“检查当前日期时间”已经结束的项目

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)

【讨论】:

  • 感谢您的回复,但 WHERE DEV_ID NOT IN(SELECT DEV_ID FROM Developer_TASK DT) 如何确保我们了解 scrum ??
  • 正确,我删除了
  • 我认为在第二个查询中Proof of concept也需要考虑??你说什么 Lasse...没关系,我会添加......谢谢你的帮助......
  • 在第一次查询中检查项目已经完成的正确方法还是我们可以做的任何其他方式?
  • 我所做的编辑是你想要的吗? "列出所有现在还没有结束的"
【解决方案2】:

哪个开发人员花时间在一个实际上已经完成的项目上,它是为哪个客户服务的?

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 构造和left join 来不丢失此类项目的行。

去年每个开发人员为概念验证项目完成了多少支持任务?

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)

查找所有 Scrum 项目的 dev_id。然后使用not in。您还可以使用not existsminus、分析count。 Oracle 通常允许以多种方式完成任务。


这里是dbfiddle demo,其中包含我想象的所有工作查询和示例数据,以检查语法是否正确以及结果是否正常。

【讨论】:

    【解决方案3】:

    如果您想知道这些问题,您首先需要在项目表中添加一个 Developer 外键。
    然后,您将能够了解项目表中的开发人员操作。
    问候

    【讨论】:

    • 我应该使用内部联接还是其他联接??
    • 对于“哪个开发人员还没有参与 Scrum 项目?”问题我需要内部加入开发人员,然后是 Developer_Task,然后是 Project 以获取 scrum 详细信息。我对吗???这么多内部连接
    猜你喜欢
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多