以下に説明するように、3つのテーブルがあります。
dbo.ServiceEntry
ID RunLogEntry Reconciled
1 0 1
2 4 1
3 5 1
dbo.ServiceEntryPart
ID ServiceEntryID PartId ServiceEntryTypeID
1 1 3 1
2 2 4 2
3 2 4 1,2
dbo.Part
ID Desc Active (bitfield)
3 xyz 1
4 abc 1
次のようにクエリします。
SELECT *
FROM ServiceEntry AS S
WHERE (S.RunLogEntryID is not null) AND (S.Reconciled=@ReconciledValue)
AND EXISTS (SELECT ServiceEntryID
FROM ServiceEntryPart SEP
JOIN Part on SEP.PartID = Part.ID
WHERE ((@ActivePart = 0 AND Part.Active is not null)
OR (@ActivePart = 1 and Part.Active = 0))
AND (@ServiceTypes is null
OR CHARINDEX(','+cast(SEP.ServiceTypeIDs as varchar(255))+',',','+@ServiceTypes+',') > 0))
OR (NOT EXISTS (SELECT ServiceEntryID
FROM ServiceEntryPart SEP
JOIN Part on SEP.PartID = Part.ID))
サービス エントリには、0 の runlogentry id を含むレコードがいくつかあります。サービス エントリ テーブルの runlogentryid 値が 0 の場合、そのサービス エントリのサービス エントリ パート レコードはありません。そのため、たとえばクエリが存在する場合と存在しない場合に気付くように、それらを 2 つに分割しました。exists ステートメントは、サービス エントリ部分を持つすべてのサービス エントリを処理し、これらに対してフィルタが適用されます。フィルターに値がある場合、フィルター servicetypeids および activepart はサービス エントリ パーツを持つレコードのみを対象としているため、存在しないブロックは必要ありません。つまり、パラメータが渡されない場合、最初の exists ブロックはサービス パーツを持つサービス エントリをフェッチし、not exists ブロックは runlogentry id が 0 OR NOT null のサービス エントリをフェッチします。これはそのままでうまくいきます。問題は、パラメーターが渡されたときに、サービス エントリ部分を持たないサービス エントリを除外する必要があり、それらが存在する場合に正しい結果が得られないことです。私は問題を説明する良い仕事をしたことを願っています..助けてください