簡體   English   中英

如何避免兩次連接到同一維表

[英]How to avoid joining to a same dimension table twice

我有具有task_id, end_time , start_timetask_instances

end_timestart_time鏈接到time_table ,該time_table包含Military_hour格式(24小時,范圍為0 -23)。

我想知道所有任務,其中each tasks start time and end_time belong to the same military hour group ( there are 6 groups , each containing 4 hours)

  select (floor(td1.military_hour/4)*4) as td1_military_hour_group, 
  (floor(td2.military_hour/4)*4) as td2_military_hour_group, wk_id 
  from task_instances t1
  inner join time_table td1 on t1.end_time = td1.time_id
  inner join time_table td2 on t1.start_time = td2.time_id 
  where  td1_military_hour_group = td2_military_hour_group

是否需要same time_table twice加入same time_table twice 我們可以改善查詢,甚至查詢看起來正確嗎?

您不能在WHERE子句中使用派生值td1_military_hour_grouptd2_military_hour_group ,否則會出現錯誤,例如“ where子句中的未知列'td1_military_hour_group””。 您需要在WHERE子句中重復計算:

select wk_id,
       (floor(td1.military_hour/4)*4) as td1_military_hour_group, 
       (floor(td2.military_hour/4)*4) as td2_military_hour_group
  from task_instances t1
  inner join time_table td1
    on t1.end_time = td1.time_id
  inner join time_table td2
    on t1.start_time = td2.time_id 
  where (floor(td1.military_hour/4)*4) = (floor(td2.military_hour/4)*4)

否則使用一個普通的表表達式:

WITH cteTime_groups AS (SELECT time_id,
                               floor(military_hour/4)*4 AS military_hour_group
                          FROM time_table)
select wk_id,
       td1.military_hour_group as td1_military_hour_group, 
       td2.military_hour_group as td2_military_hour_group
  from task_instances t1
  inner join cteTime_groups td1
    on t1.end_time = td1.time_id
  inner join cteTime_groups td2
    on t1.start_time = td2.time_id 
  where td1.military_hour_group = td2.military_hour_group

SQLFiddle在這里

暫無
暫無

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

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