SQLite查询,其中包含外部联接
我对SQL有点生疏,在查询方面遇到了一个小问题。在我们的应用程序中,我们有两个与此问题相关的表。有个条目,每个条目有N个步骤 我们正在尝试优化查询,因此我们不需要一直请求所有条目,而只需要请求上次检查后更新的条目。可能有很多步骤,因此此查询只需返回条目和一些步骤摘要数据,如果需要,我们可以单独查询步骤 输入开始时间和更新时间分别从第一个和最近的处理步骤时间计算。我们还必须将进入状态分组 以下是我们在python中构建的查询,因为它看起来更容易阅读: 语句='选择e.序列号'+\ “e.说明,”+\ “minp.start_time开始时间,”\ “组状态状态,”+\ 'maxp.last_updated last_updated'+\ '来自条目e'+\ '左外连接过程\u步骤p在e.serial\u编号=p.serial\u编号'+\ 如果用户提供自日期,则仅返回在之后更新的条目 那天 如果“自”不是“无”: 语句+='WHERE last_updated>{0}' 语句+=“按e.序列号分组” 我们面临的问题是,如果我们应用WHERE子句,它也会过滤流程步骤。例如,如果我们有两个条目:SQLite查询,其中包含外部联接,sql,sqlite,Sql,Sqlite,我对SQL有点生疏,在查询方面遇到了一个小问题。在我们的应用程序中,我们有两个与此问题相关的表。有个条目,每个条目有N个步骤 我们正在尝试优化查询,因此我们不需要一直请求所有条目,而只需要请求上次检查后更新的条目。可能有很多步骤,因此此查询只需返回条目和一些步骤摘要数据,如果需要,我们可以单独查询步骤 输入开始时间和更新时间分别从第一个和最近的处理步骤时间计算。我们还必须将进入状态分组 以下是我们在python中构建的查询,因为它看起来更容易阅读: 语句='选择e.序列号'+\ “e.说明,”+
Entry: 123 foo
Steps:
1. start time 10:00, updated 10:30, status completed
2. start time 11:00, updated 11:30, status completed
3. start time 12:00, updated 12:30, status failed
4. start time 13:00, updated 13:30, status in_progress
Entry: 321 bar
Steps:
1. start time 01:00, updated 01:30, status completed
2. start time 02:00, updated 02:30, status completed
如果我们在没有where的情况下进行查询,我们将获得所有条目。因此,对于这种情况,它将返回:
321, bar, 01:00, "completed,completed", 02:30
123, foo, 10:00, "completed,completed,failed,in_progress", 13:30
如果我的时间是12:15,那么它只会返回以下内容:
123, foo, 12:00, "failed,in_progress", 13:30
因此,开始时间来自步骤3,状态仅来自步骤3和4。我要找的是整个条目:
123, foo, 10:00, "completed,completed,failed,in_progress", 13:30
因此,基本上,我想根据上次更新的值过滤最终结果,但它目前也在过滤连接结果,这会丢弃开始时间、上次更新的时间和状态值,因为它们是通过一部分步骤计算的。你知道如何修改查询以得到我想要的吗
编辑:
这里似乎也有一些命名问题。我在示例代码中使用的名称与我们在代码中实际使用的名称相同或相似。如果我们将maxp.last\u updated last\u updated更改为maxp.last\u updated max\u last\u updated,并将WHERE子句更改为使用max\u last\u updated,则会出现操作错误:滥用聚合:max我们还尝试在其中添加as语句,但没有任何区别。创建一个子查询,首先选择更新的进程:
SELECT whatever you need FROM entries e
LEFT OUTER JOIN process_steps p ON e.serial_number = p.serial_number
WHERE e.serial_number in (SELECT distinct serial_number from process_steps
WHERE last_updated > "date here")
GROUP BY e.serial_number
您可以使用having子句执行此操作:
SELECT . . .
FROM entries e LEFT JOIN
process_steps ps
ON e.serial_number = ps.serial_number
GROUP BY e.serial_number
HAVING MAX(ps.last_updated) > <your value here>;