Report Builder 3.0中IN语句仅返回首个工作流结果的技术问题
解决SQL IN语句仅返回首个工作流结果的问题
嘿,我一眼就揪出问题所在了——你的Workflow这个OUTER APPLY子查询里用了TOP 1,这直接把每个订单能关联到的工作流记录限制成了唯一一条,哪怕数据库里有多个符合条件的工作流。
问题根源分析
看你这段Workflow的查询逻辑:
OUTER APPLY ( SELECT TOP 1 WF.Workflow AS WF FROM s_SynARXref_Main MN (nolock) inner join s_SynARXref_Workflow WF with (nolock) on MN.WorkFlowID$ = WF.WorkFlowID$ WHERE MN.OrderNumber = OH.ord_number AND WF.Workflow <> 'Complete' AND MN.IN_DocTypeID IN (SELECT DT.IN_DocTypeID FROM s_SynARXref_DocTypes DT (nolock) WHERE DT.In_DocTypeName = 'BOL') ) as Workflow
这里的TOP 1会强制每个订单只取第一条匹配的工作流记录。当你在外层WHERE加Workflow.WF IN ('Check-In BOL')时,刚好这条唯一的记录匹配,所以能返回结果;但如果想筛选多个工作流,其他符合条件的工作流根本没被查出来(因为TOP 1已经截断了结果集),自然只会返回那些第一条工作流匹配IN条件的订单。
两种解决方案(按需选择)
方案1:每个订单仅保留一条符合筛选条件的工作流
如果你的报表逻辑是每个订单只需要显示一条工作流,但要支持筛选多个工作流类型,把筛选条件移到OUTER APPLY的子查询里,而不是外层WHERE:
OUTER APPLY ( SELECT TOP 1 WF.Workflow AS WF FROM s_SynARXref_Main MN (nolock) inner join s_SynARXref_Workflow WF with (nolock) on MN.WorkFlowID$ = WF.WorkFlowID$ WHERE MN.OrderNumber = OH.ord_number AND WF.Workflow <> 'Complete' AND MN.IN_DocTypeID IN (SELECT DT.IN_DocTypeID FROM s_SynARXref_DocTypes DT (nolock) WHERE DT.In_DocTypeName = 'BOL') AND WF.Workflow IN ('Check-In BOL', 'Workflow2', 'Workflow3') -- 把筛选条件放在这里 ) as Workflow
这样TOP 1会从符合筛选条件的工作流里取第一条,外层WHERE里的AND Workflow.WF IN (...)可以去掉(留着也不影响,但子查询里筛选更高效)。
方案2:每个订单返回所有符合筛选条件的工作流
如果报表需要显示一个订单对应的所有符合条件的工作流(即一个订单对应多行结果),直接去掉TOP 1即可:
OUTER APPLY ( SELECT WF.Workflow AS WF FROM s_SynARXref_Main MN (nolock) inner join s_SynARXref_Workflow WF with (nolock) on MN.WorkFlowID$ = WF.WorkFlowID$ WHERE MN.OrderNumber = OH.ord_number AND WF.Workflow <> 'Complete' AND MN.IN_DocTypeID IN (SELECT DT.IN_DocTypeID FROM s_SynARXref_DocTypes DT (nolock) WHERE DT.In_DocTypeName = 'BOL') AND WF.Workflow IN ('Check-In BOL', '其他工作流') ) as Workflow
这样每个符合条件的工作流都会和订单关联生成一行结果,报表里就能看到所有匹配的工作流了。
额外提示
- 测试时可以单独运行
Workflow的子查询(把OH.ord_number替换成一个实际存在的订单号),看看返回多少条记录,确认筛选条件是否生效。 - 如果用Report Builder的参数来传递工作流列表,记得把参数设置为允许多值,然后在SQL里用
@YourWorkflowParameter代替硬编码的IN列表,这样报表里就能直接多选工作流筛选了。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

