我有一个需要创建的查询,它从三个不同的表中提取数据。本质上,最终结果是提取自2018年7月1日以来在用户帐户上没有任何活动的用户的数据,但他们必须具有“x”帐户计划。有没有办法处理我创建的这个查询,让它显示我需要的内容?也许以某种方式将其与TRANDATE列上的计数0相关联?非常迷失在这里,需要一些帮助!
select p.ID as ID, p.LAST as LastName, p.FIRST as FirstName
From gl
inner join p
on p.ID = gl.PID
left join psp
on psp.PLANNUM = gl.ACCNUM
where gl.ACCNUM = 'x'
and psp.ACTIVE = 1
and gl.TRANDATE <= to_date('07/01/2018', 'MM/DD/YYYY')
;
commit;非常感谢大家,如果还有什么需要我提供的,请告诉我。
发布于 2018-09-11 02:48:57
您实际上并没有指定您的表结构,所以我在这里有点猜测。您的"gl“表是否每个PID+ACCNUM有多条记录?主键是什么?你可以提供很多额外的细节。
select p.ID as ID, p.LAST as LastName, p.FIRST as FirstName, g.maxdate
From (select gl.PID, gl.ACCNUM, max(gl.TRANDATE) as maxdate
from gl
where gl.ACCNUM = 'x'
group by gl.PID, gl.ACCNUM) g
inner join p
on p.ID = g.PID
inner join psp
on psp.PLANNUM = g.ACCNUM
and psp.ACTIVE = 1
where g.maxdate <= to_date('07/01/2018', 'MM/DD/YYYY')
;此外,(a)您不需要在select上执行commit,并且(b)当WHERE子句中包含左/外连接的列(psp.ACTIVE = 1)时,该连接是内连接。
发布于 2018-09-11 02:57:20
我只需在having子句中使用aggregation和max():
select p.ID as ID, p.LAST as LastName, p.FIRST as FirstName
from gl inner join
p
on p.ID = gl.PID inner join
psp
on psp.PLANNUM = gl.ACCNUM
where gl.ACCNUM = 'x' and psp.ACTIVE = 1
group by p.ID, p.LAST, p.FIRST
having max(gl.TRANDATE) <= date '2018-07-01';请注意,psp.ACTIVE上的where条件将外连接转换为内连接,因此为了提高可读性,我更改了join类型。
发布于 2018-09-11 02:43:34
由于您的所有显示字段都来自p,因此您可以在内部查询中对多次出现的p.id进行分组。所有剩余的ids(不在中)都是您感兴趣的。
select p.ID as ID, p.LAST as LastName, p.FIRST as FirstName
From p where p.ID not in (
select p.ID From gl
inner join p on p.ID = gl.PID
left join psp on psp.PLANNUM = gl.ACCNUM
where gl.ACCNUM = 'x'
and psp.ACTIVE = 1
and gl.TRANDATE <= to_date('07/01/2018', 'MM/DD/YYYY')
group by p.ID
having count(1) >= 1)https://stackoverflow.com/questions/52263179
复制相似问题