1

使用 SQL Server 2000

假期(表)

dates

2012-08-02 
2012-08-19 
2012-08-20 

表格1

id dates time

001 01/08/2012 00:00
001 02/08/2012 00:00
001 03/08/2012 00:00
001 04/08/2012 12:00
...
...
001 17/04/2012 11:00
001 18/08/2012 00:00
001 19/08/2012 00:00
001 20/08/2012 00:00
001 21/08/2012 12:00
...

我想检查每列的上一个日期和下一个日期,然后我想更新现在或缺席或假期。

条件

  • 如果当前行时间不等于 00:00,则状态应为P(当前)
  • 如果上一个日期时间列是 00:00 并且下一个日期时间列是 00:00 那么自动当前行状态应该是AB(缺席),
  • 如果日期等于假期表日期,则自动当前行状态应为H

注意:这个查询运行没有任何失败,唯一的问题是耗时......

询问

Select 
    t2.id, 
    t2.dates, 
    case 
        when t2.time <> '00:00' 
            then 'P' 
        when t4.dates = t2.dates and t1.intime = '00:00' and t3.intime = '00:00' 
            then 'AB' 
        else 'H' 
    end as attn 
from
    (
        Select id, dates, time from table1 
        where t1.dates = Cast('18/08/2012' as datetime)
    ) t1 
    left outer join
    (
        Select id, dates, time from table1 
        where t2.dates = Cast('19/08/2012' as datetime)
    ) t2 
    on t1.id = t2.id
    left outer join 
    (
        Select id, dates, time from table1 
        where t2.dates = Cast('20/08/2012' as datetime)
    ) t3 
    on t2.id = t3.id
    left outer join 
    (
        select dates from holiday
    ) t4 
    on t4.dates = t2.dates

上面的查询工作正常,但显示需要更多时间,因为我想查看每个的数据01/09/2012,我有 n 个 id,系统正在检查每个 id 的上一个日期和下一个日期并显示结果。 30/09/2012id

任何其他替代查询或解决方案都可用于显示数据

4

2 回答 2

1

正如 Gordon 所说,您的结构很好,但我可以向您推荐另一种方法,以提高此查询(或任何其他重型查询)的性能,即使用Database Engine Tuning Advisor

使用此工具,SQL Server 将尝试创建额外的索引、统计信息以及任何其他可以提高所提供查询性能的内容。

要启动它,请从查询窗口中选择您的查询文本,右键单击,然后选择Analyze Query in Database Engine Tuning Advisor

在此处输入图像描述

于 2012-09-08T14:48:20.333 回答
0

您的基本查询结构很好。就个人而言,我不会硬编码子查询中的日期,而是将日期添加到“on”子句中。

您可以通过在 (id, date) 上创建索引来加快运行速度:

create index table1_id_date on table1(id, date)

假期索引也可能有所帮助:

create index holiday_date on holiday(date)

您还可以升级到更新版本的 SQL Server。由于 lag() 和 lead() 函数,您的查询在 SQL Server 2012 中表达起来会更快、更容易。

于 2012-09-08T14:40:35.530 回答