繁体   English   中英

结合SQL服务器查询速度

[英]Combining SQL Server queries for speed

我有两张表,一张是需要定期检查的项目,一张是这些项目的检查报告。

如果工程师出于某种原因无法看到项目,则可以将项目标记为“不可用于检查”。

我需要显示项目清单,显示每个项目的最后实际检验日期。 如果项目的最后一次实际检查与最后一次访问日期不同(即最后一次尝试检查),则需要突出显示。

这是我目前拥有的:

表和列:

Items
ID, Name, etc...

ReportItems
ReportID, ItemID, InspectionDate, NotAvailable

开始狡猾的伪代码:

SELECT * FROM Items

' then loop through that to display the data:
For each itemDataRow

  ' Get last actual date
  datatable1 = SELECT TOP 1 ReportID, InspectionDate FROM ReportItems WHERE ItemID = itemDataRow(ID) AND NotAvailable = 0 ORDER BY InspectionDate DESC

  ' Get last attempted date
  datatable2 = SELECT TOP 1 ReportID FROM ReportItems WHERE ItemID = itemDataRow(ID) ORDER BY InspectionDate DESC

  ' Check if they are the same
  itemWasNotAvailableAtLastVisit = datatable1(ReportID) <> datatable2(ReportID)

  ' add row to list to display, showing datatable1(InspectionDate), highlighted if itemWasNotAvailableAtLastVisit == true

End loop

问题在于,这意味着在填充数据时对每个项目进行 2 次额外的数据库查询,这会大大降低速度,尤其是在较长的列表中。

我如何优化它,最好是将其优化为单个快速查询?

我试过这样的子查询,但速度很慢:

SELECT ID, Name, (
SELECT TOP 1 InspectionDate FROM ReportItems WHERE ItemID = Items.ID AND Available = 0 ORDER BY InspectionDate DESC
) AS LastInspection,
(
SELECT TOP 1 InspectionDate FROM ReportItems WHERE ItemID = Items.ID ORDER BY InspectionDate DESC
) AS LastVisit
 FROM Items

样本数据:

项目

ID | Name
---------
1  | Crane
2  | Tractor
3  | Forklift

报告项目

ReportID | VisitID | ItemID | InspectionDate | NotAvailable
----------------------------------------------------------------
1        | 1       | 1      | 2022-04-20     | 0
2        | 1       | 2      | 2022-04-20     | 1
3        | 1       | 3      | 2022-04-20     | 0
4        | 2       | 1      | 2022-03-15     | 0
5        | 2       | 2      | 2022-03-15     | 0
6        | 2       | 3      | 2022-03-15     | 0

期望的结果:

Crane, last inspection was 2022-04-20
Tractor, last inspection was **2022-03-15** (NB This is not the last visit date) 
Forklift, last inspection was 2022-04-20

根据您的示例查询,您可能可以按如下方式加入/分组/最大:

SELECT ID, [Name]
    , MAX(CASE WHEN Available = 0 THEN InspectionDate END) AS LastInspection
    , MAX(InspectionDate) AS LastVisit
FROM Items I
JOIN ReportItems RI on RI.ItemID = I.ID
GROUP BY I.ID;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM