我有如下所述的三个表:
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))
服务条目有一些包含runlogentry id 为0 的记录。如果服务条目表中的runlogentryid 值为0,则该服务条目将没有服务条目部分记录。这就是为什么我将它们分成两部分,正如您从查询中注意到的那样,例如存在和不存在。exists 语句处理所有具有服务条目部分的服务条目,对于这些条目,过滤器将适用。如果过滤器有值,则不需要不存在块,因为过滤器 servicetypeids 和 activepart 仅用于具有服务条目部分的记录。因此,换句话说,如果没有传递参数,则第一个存在块获取具有服务部分的服务条目,不存在获取具有 0 或非空的 runlogentry id 的服务条目。这很好用。问题是当参数通过时,我需要排除没有服务条目部分的服务条目,当它们存在时,我没有得到正确的结果。我希望我在解释问题方面做得很好。请帮忙