[英]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 exists
, minus
,分析count
。 Oracle通常允許以多種方式執行任務。
這是dbfiddle演示,其中包含所有有效的查詢和示例數據,我認為它們可以用來檢查語法是否正確以及結果是否正常。
如果您想知道這些問題,首先需要在Project表中添加一個Developer外鍵。
然后,您將能夠知道Project表中的Developer動作。
問候
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.