【发布时间】:2021-04-06 17:32:07
【问题描述】:
我有一个带有表格的数据库
- 我们服务的设备(表
e,字段e_id) - 设备合同(表
c,字段c_id,e_id,c_start,c_end) - 我们过去执行的维护(表
m,e_id,m_id,m_date)
我正在尝试构建一个查询,它将显示所有设备记录,如果它当前与开始/结束日期签订合同,以及自合同开始日期以来执行的任何维护的计数。
我有一个子查询来获取当前合同(这个表很大,每个合同修订都有一个新行),但我不知道如何使用合同子查询的结果来返回维护访问,因为该日期而不返回多行。
select
e.e_id,
c2.c_id,
c2.c_start,
c2.c_end,
m2.count
from e
left join (
select
c_id,
c_start,
c_end,
e_id
...other things and filtering by joining the table to itself
from c
) as c2 on c2.e_id = e.e_id
我也希望能够添加这个
m-subquery v1
left join (
select
count(*),
e_id
from m
where m.m_date >= c2.start
) as m2 on m2.e_id = e.e_id
但我无法从第二个子查询中访问 c2.C_start。
我可以通过在子查询外部加入来返回此表,但这会返回多行。
m-subquery v2
left join (
select
e_id,
m_date,
from m
) as m2 on m2.e_id = e.e_id and m.m_date >= c2.start
有没有办法:
- 将子查询字段 c2.start 获取到 m-subquery v1 中?
- 聚合m-subquery v2的结果而不使用group by(主select查询中有很多列)?
- 这样做不同吗?
我已经看到lateral,我认为这可能是我需要的,但我已经单独和一起尝试了两个子查询前面的关键字,但让我在任何内部使用 c2.c_start 都没有用点。
我有点不喜欢使用 group by,主要是因为工作中的 BI 分析师在报告中有重复项而不是尝试正确理解业务流程/数据库时说“对它进行分组”。当我确定e 表每个e_id 有一条记录时,我觉得不需要对主查询进行分组,并且在组中命名的 60 列中可能有 59 列的混乱by 会导致查询的可维护性降低。
谢谢, 山姆
【问题讨论】:
-
是否可以将每个子查询创建为视图?您可以将视图视为查询中的表、跨视图连接等等。
-
这可能是我最终会做的事情,但下面的
WITH subquery_name AS (SELECT...)似乎基本上可以做到这一点,而不必为一份报告维护多个视图/查询。如果我要在其他地方重用子查询,视图可能会更好。
标签: sql postgresql subquery