SQL查询 - 性能和在查询中使用内部选择

时间:2017-06-28 09:23:30

标签: sql oracle performance

我是SQL的新手,我有一个问题。

此查询可以快速轻松地工作,在所有字段中声明container_id名称。

git pull

如何在各种选择中连接所有container_id?有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我认为此查询与您的查询相同:

select a.master_container_id 
from container_history a 
where action_ts in 
  (select min(b.action_ts)
   from  container_history b 
   where b.container_id = a.container_id
   and b.putaway_date in 
       (select min(c.putaway_date) 
        from container_history c
        where c.container_id = b.container_id))
and a.container_id = 'abc' 
order by a.action_ts desc;

请注意,在查询中多次引用同一个表时,应使用不同的表别名。

(注意我只是因为我发现它更容易在眼睛上切换到小写!)

答案 1 :(得分:0)

这是使用分析函数的一种方法:

SELECT container_id,
       master_container_id,
       putaway_date,
       action_ts
FROM   (SELECT container_id,
               master_container_id,
               putaway_date,
               action_ts,
               MIN(CASE WHEN putaway_date = min_putaway_date THEN action_ts END) OVER (PARTITION BY container_id) min_action_ts_per_min_pa_dt
        FROM   (SELECT container_id,
                       master_container_id,
                       putaway_date,
                       action_ts,
                       MIN(putaway_date) OVER (PARTITION BY container_id) min_putaway_date
                FROM   container_history))
WHERE  action_ts = min_action_ts_per_min_pa_dt;

N.B。未经测试。

首先在container_history表的所有行中为每个container_id计算最小putaway_date。

然后,当putaway_date最早时,它会计算出最小的action_ts。

最后,它选择那些action_ts与之前确定的最小action_ts匹配的行。

N.B。因为分析函数是通过container_id进行分区的,如果要在外部选择上放置where container_id = '<val>'的where子句,Oracle应该能够将谓词下推到内联视图中,这意味着它只需要运行分析针对特定container_id的函数。如果外部查询的谓词不包含对container_id的过滤,那么Oracle必须在所有container_id之前运行分析函数,然后才能进行任何过滤。我提到这是因为性能影响。