我有一个包含三个字段的表:ID
,date
和action
。 action
的三个可能值是X
,Y
和Z
。我想要一个查询,对于其中有一行Z
操作的表中的每个ID
,将返回ID
操作的最近行(如果存在X
操作)。Oracle中的嵌套子查询很慢
这是我想在MySQL中做的事情。我复制并粘贴了sqlfiddle.com的代码,所以我知道它的工作原理。
create table a (id int,
date int,
action varchar(1));
insert into a values(1, 1, 'X');
insert into a values(1, 2, 'X');
insert into a values(1, 3, 'Z');
insert into a values(2, 1, 'X');
insert into a values(2, 2, 'Y');
insert into a values(2, 3, 'Y');
insert into a values(2, 4, 'Z');
insert into a values(3, 1, 'X');
insert into a values(3, 2, 'Y');
insert into a values(3, 3, 'X');
insert into a values(3, 4, 'Z');
insert into a values(4, 3, 'X');
SELECT a.id,
max(a.date) as Xdate,
b.date as Zdate,
a.action FROM a,
(SELECT * FROM a WHERE a.action = 'Z') b
WHERE
a.date < b.date AND
a.ID = b.ID AND
a.action = 'X'
GROUP BY a.id;
我不能使用与甲骨文其他领域类似这样的GROUP BY
条款,所以我做了一个嵌套子查询其发现单独的每个ID的最大日期,但速度很慢(我期待着得到大约10^5行),我希望有更好的方法来做到这一点会更快。 (我目前无法发布我的实际Oracle查询,因为它不会在SQLfiddle中运行;它总是抱怨行被不明确地定义)。
上面的查询可以在Oracle中以某种方式工作吗?如果没有,是否有相当的方法可以在合理的时间内运行?
您的查询不起作用,因为您无法使用名称'date'作为字段名称,无论如何,纠正后,查询不起作用。请更正它,然后发布正确的查询以了解您想要的内容。 –
请尝试此查询[sqlfiddle](http://sqlfiddle.com/#!4/adc50/7) –