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(Present)になります。
  • 前の日時列が 00:00 で、次の日時列が 00:00 の場合、自動的に現在の行のステータスはAB(Absent) になります。
  • 日付が休日テーブルの日付と等しい場合、自動的に現在の行のステータスが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までのデータを表示したいため、表示に時間がかかりました。ID の数は n で、システムは各 ID の前の日付と次の日付をチェックし、結果を表示しています。 30/09/2012id

データを表示するための他の代替クエリまたはソリューションがあります

4

2 に答える 2

1

ゴードンが言ったように、あなたの構造は問題ありませんが、このクエリ (または他の重いもの) のパフォーマンスを向上させるために、データベース エンジン チューニング アドバイザを使用する別の方法をお勧めします。

このツールを使用すると、SQL サーバーは追加のインデックス、統計、および提供されたクエリのパフォーマンスを向上させる可能性のあるその他のものを作成しようとします。

それを起動するには、クエリ ウィンドウからクエリ テキストを選択し、右クリックして [データベース エンジン チューニング アドバイザーでクエリを分析] を選択します。

ここに画像の説明を入力

于 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 に答える