我需要创建一个查询,该查询从三个不同的表中提取数据。从本质上讲,最终结果是为自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;
非常感谢大家,如果我在这里还可以提供其他信息,请告诉我。
答案 0 :(得分:1)
您实际上并未指定表结构,因此我在这里有点猜测。您的“ 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进行提交,并且(b)当您的WHERE子句中的列(psp.ACTIVE = 1)时,左/外联接是内部联接。 / p>
答案 1 :(得分:1)
我只会在max()
子句中使用聚合和having
:
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';
请注意,where
上的psp.ACTIVE
条件将外部联接变为内部联接,因此为了便于阅读,我更改了join
类型。
答案 2 :(得分:0)
由于所有显示字段都来自p,因此您可以在内部查询中对p.id进行分组,该分组会多次出现。所有其余的ID(不在其中)都是您的兴趣所在。
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)