レポートシステム用に作業しているSQLの一部を継承しました。このシステムは、発注書を中心としており、発注書が作成、送信、確認、および確認されるときに使用されます。これらの状態はプログレッシブ状態です。私がレビューしているSQLの一部を以下に示します。これは、WHERE句からのものです。
OR (CreateJob.endtime is NULL and DATEDIFF(hour, buy_date, getdate()) > Vendor.expected_create_hours)
OR (TransmitJob.endtime is NULL and DATEDIFF(hour, CreateJob.endtime, getdate()) > Vendor.expected_transmit_hours)
OR (AcknowledgeJob.endtime is NULL and DATEDIFF(hour, TransmitJob.endtime, getdate()) > Vendor.expected_acknowledge_hours)
OR (ConfirmJob.endtime is NULL and DATEDIFF(hour, AcknowledgeJob.endtime, getdate()) > Vendor.expected_confirm_hours)
私が見つけたのは、ジョブが失敗したためにCreateJobに終了時間がない可能性があるということです。ただし、ジョブは複数の発注書を実行できるため、特定のPOが実際に作成されたが、後で兄弟が失敗したためにジョブが終了時刻を受け取らない場合があります。これにより、POの状態が引き続き進行するシナリオが作成されますが、CreateJob.endtimeがNULLであるため、この問題レポートに引き続き表示されます。
したがって、最初に上記のシステムとアーキテクチャにいくつかの明らかなバグがありますが、それは私が現在取り組んでいるものとは別の問題です。
基本的にプログレッシブチェックをANDステートメントとして追加することで、レポートを修正できたようです。したがって、CreateJobの最初のチェックも変更されます。
( (CreateJob.endtime is NULL and DATEDIFF(hour, buy_date, getdate()) > Vendor.expected_create_hours)
AND (TransmitJob.endtime is NULL and DATEDIFF(hour, CreateJob.endtime, getdate()) > Vendor.expected_transmit_hours)
AND (AcknowledgeJob.endtime is NULL and DATEDIFF(hour, TransmitJob.endtime, getdate()) > Vendor.expected_acknowledge_hours)
AND (ConfirmJob.endtime is NULL and DATEDIFF(hour, AcknowledgeJob.endtime, getdate()) > Vendor.expected_confirm_hours))
これは醜く、物事を難読化して忘却し始めます。SQLで次のようなことを行う方法はありますか?基本的に、ある種のマクロまたは#defineシステムですか?
CreateFailed = (CreateJob.endtime is NULL and DATEDIFF(hour, buy_date, getdate()) > Vendor.expected_create_hours)
TransmitFailed = (TransmitJob.endtime is NULL and DATEDIFF(hour, CreateJob.endtime, getdate()) > Vendor.expected_transmit_hours)
AcknowledgeFailed = (AcknowledgeJob.endtime is NULL and DATEDIFF(hour, TransmitJob.endtime, getdate()) > Vendor.expected_acknowledge_hours)
ConfirmFailed = (ConfirmJob.endtime is NULL and DATEDIFF(hour, AcknowledgeJob.endtime, getdate()) > Vendor.expected_confirm_hours)
OR (CreateFailed AND TransmitFailed AND AcknowledgeFailed AND ConfirmFailed)
OR (TransmitFailed AND AcknowledgeFailed AND ConfirmFailed)
OR (AcknowledgeFailed AND ConfirmFailed)
OR (ConfirmFailed)
私がやろうとしていることに共通の用語や名前がある場合、誰かがそれをタイトルに追加する可能性がありますか?