我是SQL的新手,我有一个问题。
此查询可以快速轻松地工作,在所有字段中声明container_id名称。
git pull
如何在各种选择中连接所有container_id?有更好的方法吗?
答案 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之前运行分析函数,然后才能进行任何过滤。我提到这是因为性能影响。