【问题标题】:SQL Conditionally join tablesSQL 有条件地连接表
【发布时间】:2020-01-21 16:17:13
【问题描述】:

我有两个表 Task 和 Allocated_Task。

Allocated_Task 有 AT.id、Task.id(可以为空)、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,如果在 Allocated_Tasks 中不存在则返回 Task.Name,如果用户给出 AT.id,那么它应该给出 At.id,如果 Allocated_Task 中的 task.id 不为 null 则为 task.name,如果 Allocated_Task 中的 task.id 为 null

分配的任务

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(存储任务分配时间)。使用完全外连接需要几分钟才能执行,这在这种情况下并不理想。是否可以提高查询效率?

【问题讨论】:

    标签: sql


    【解决方案1】:

    它是完全连接:

    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
    

    【讨论】:

    • 完全外连接给出了预期的结果,但它花费了很多时间。是否可以在没有完全外连接的情况下做到这一点,以便快速执行查询?
    • 当您使用 id 过滤时(如果 id 是您的聚集索引),这不应该是非常昂贵的查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 2023-03-24
    • 2018-07-18
    • 2013-05-18
    • 2014-12-25
    • 2011-03-29
    相关资源
    最近更新 更多