簡體   English   中英

聯接查詢以選擇表

[英]Join queries to select tables

我剛剛開始學習Join in SQL。 我已經閱讀了各種在線和離線教程以了解它。 然后我開始做一些問題,以了解我的理解。 下表

開發人員表
1)ID號
2)NAME VARCHAR2

客戶表
1)編號
2)NAME VARCHAR2

項目表
1)編號
2)CUSTOMER_ID NUMBER(內部項目為NULL)
3)NAME VARCHAR2 4)類型編號(0-Scrum,1-固定價格,2-概念證明)
5)START_DATE DATE(如果尚未開始,則為NULL)
6)END_DATE DATE(如果尚未完成,則為NULL)

任務表
1)ID號
2)NAME VARCHAR2
3)PROJECT_ID NUMBER
4)TYPE NUMBER(0-部署,1-支持,2-工單,3-任務)
5)START_DATE DATE(如果尚未開始,則為NULL)
6)END_DATE DATE(如果尚未完成,則為NULL)

Developer_Task表
1)DEV_ID NUMBER
2)TASK_ID NUMBER


現在我想為這些問題寫查詢:

1)哪個開發人員花了時間在一個實際上已經完成的項目上,並且是為哪個客戶服務的?
2)每個開發人員去年為概念證明項目從事過多少支持任務?
3)哪個開發人員尚未參與Scrum項目?

連接需要一些共同的屬性。 基於此,我們需要編寫查詢。 我無法理解這些表之間的關系以及如何為這些表編寫查詢?

就像是:

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)

哪個開發人員花了時間在實際上已經完成的項目上,以及該客戶是誰?

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演示,其中包含所有有效的查詢和示例數據,我認為它們可以用來檢查語法是否正確以及結果是否正常。

如果您想知道這些問題,首先需要在Project表中添加一個Developer外鍵。
然后,您將能夠知道Project表中的Developer動作。
問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM