簡體   English   中英

SQL 有條件地連接表

[英]SQL Conditionally join tables

我有兩個表 Task 和 Allocated_Task。

Allocated_Task 有 AT.id、Task.id(可以為 null)、AT.allocated_date

任務有 Task.id、Task.name 等

用戶可以提供 Task.id 或 AT.id 作為輸入

select AT.id, Task.Name 
from Allocated_Task, Task 
where (Task.id = :INPUT_TASK_ID or AT.id = :INPUT_AT_id)

預期輸出:如果用戶提供 task.id 作為輸入,它應該在 Allocated_Tasks 中搜索 task.id 並返回 AT.id,Task.Name(如果存在)或 null,Task.Name 如果它在 Allocated_Tasks 中不存在,如果用戶給出AT.id 那么它應該給出 At.id, task.name 如果 Allocated_Task 中的 task.id 不為 null 並且 null 如果 Allocated_Task 中的 task.id

分配的任務

AT.id | Task.id
---------------
  1   |  10
  2   |  null

任務

Task.Id | Name
----------------
     10 | Name1
     20 | Name2

輸出:

AT.ID | NAME
---------------------------------------------------
1     | Name1 (if user gives 1 as INPUT_AT_id)
2     | null (if user gives 2 as INPUT_AT_id)
1     | Name1 (if user gives 10 as INPUT_TASK_ID)
null  | Name2 (if user gives 20 as INPUT_TASK_ID)

更新:任務分配給員工(以千為單位),一個員工可以分配 n 個任務(10s ~ 100s),一個任務可以分配給 n 個員工。

如果用戶按 Task.Id 過濾,我們只需要最新的 Allocated_Task.ID(存儲任務分配時間)。 使用完全外連接需要幾分鍾來執行,這在這種情況下並不理想。 是否可以提高查詢效率?

這是完全加入:

SELECT AT.id, T.Name
FROM Allocated_Task AT
FULL JOIN Task T
  ON AT.TaskId = T.Id
WHERE T.id = :INPUT_TASK_ID
  OR AT.id = :INPUT_AT_id

暫無
暫無

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

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