join子句中的表达式?

时间:2015-07-23 16:26:37

标签: oracle join oracle11g

Oracle表

以下查询的作用为START_TIME_DT.LABEL_DATE_TIME_15MIN_INT输出与之类似。我必须承认,这是我第一次写这样的联接,是否可以接受,或者是否有更有效/正确的方法来实现这一目标?

select
  A.ID,
  trunc(A.START_TIME,'dd') + (round(to_char(A.START_TIME,'sssss') / 900) / 96) as START_TIME_,
  DT.LABEL_DATE_TIME_15MIN_INT
from TBL_A A
  inner join DATE_TIME DT 
    on ((trunc(A.IN_TIME_START,'dd') + (round(to_char(A.IN_TIME_START,'sssss') / 900) / 96)) = DT.DATE_TIME_15MIN_INT)
order by A.ID;

接近原因:A.START_TIMETIMESTAMP(6) GMT-5 DT表格在GMT中具有EPOCH时间键,具有相应的"格式化标签"调整为GMT-5。而不是将A.START_TIME转换为EPOCH,调整时区,并加入密钥,我将算术执行到A到正确的15分钟间隔,然后加入标签。我在这里错过了一个非常简单的解决方案

1 个答案:

答案 0 :(得分:1)

我会采用更简洁的方法:

SELECT
    a.id,
    a.start_time_,
    dt.label_date_time_15min_int
FROM
    date_time dt 
        JOIN (
            SELECT
                id,
                TRUNC(in_time_start,'dd') + (ROUND(TO_CHAR(in_time_start,'sssss') / 900) / 96) AS in_time_start_,
                TRUNC(start_time,'dd') + (ROUND(TO_CHAR(start_time,'sssss') / 900) / 96) AS start_time_
            FROM 
                tbl_a 
        ) a ON a.in_time_start_ = dt.date_time_15min_int
ORDER BY
    a.id
;

但从根本上说,没有多大区别。您的加入是有效的,如果您愿意,也可以将其放在where子句中。在这一点上,如果没有结构性和应用性的改变,你可以做很多事情来优化它。