SQL查询-性能和在查询中使用内部选择
我是SQL的新手,我有一个问题 此查询工作快速且简单,在所有字段中声明容器id名称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
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,有更简单的方法来编写此查询。你应该用样本数据和期望的结果问另一个问题。