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

SQL查询-性能和在查询中使用内部选择,sql,oracle,performance,Sql,Oracle,Performance,我是SQL的新手,我有一个问题 此查询工作快速且简单,在所有字段中声明容器id名称 SELECT MASTER_CONTAINER_ID FROM CONTAINER_HISTORY A WHERE ACTION_TS IN (SELECT MIN(ACTION_TS) FROM (SELECT * FROM CONTAINER_HISTORY WHERE CONTAINER_ID = 'abc' AND PUTAWAY

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

此查询工作快速且简单,在所有字段中声明容器id名称

SELECT MASTER_CONTAINER_ID 
FROM CONTAINER_HISTORY A 
WHERE ACTION_TS IN 
  (SELECT MIN(ACTION_TS)
   FROM (SELECT * 
         FROM CONTAINER_HISTORY 
         WHERE CONTAINER_ID = 'abc' 
         AND PUTAWAY_DATE IN 
           (SELECT MIN(PUTAWAY_DATE) 
            FROM CONTAINER_HISTORY 
            WHERE CONTAINER_ID = 'abc' )))
AND CONTAINER_ID = 'abc' 
ORDER BY ACTION_TS DESC;

如何连接各个选择中的所有容器ID?有更好的方法吗?

我认为这个查询相当于您的查询:

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;
请注意,在查询中多次引用同一个表时,应使用不同的表别名


(注意,我改用小写,只是因为我觉得它更容易看!)

这里有一种方法,使用分析函数:

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;
注意:未经测试

这是通过在container_history表的所有行中首先计算每个container_id的最小存放日期来实现的

然后,计算出最早接收日期时的最小动作

最后,它选择那些具有与先前确定的最小操作匹配的操作的行


注意:由于分析函数是按容器id进行分区的,如果要在外部选择上放置
where container\u id='
的where子句,Oracle应该能够将谓词向下推到内联视图中,这意味着它只需针对特定的容器id运行分析函数。如果外部查询的谓词不包括对容器id的过滤,那么Oracle必须在所有容器id上运行分析函数,然后才能进行任何过滤。我之所以提到这一点是因为它对性能的影响。

谢谢,它很有效。对于新手的问题,很抱歉,刚刚进入SQLSQL,有更简单的方法来编写此查询。你应该用样本数据和期望的结果问另一个问题。