我有以下表格:
生产表
SerialNumber WorkOrderNumber ItemName ItemType
1234 A2234 ASD 1
1234 A2234 ASD-T 2
1111 B2234 ZXC-T 2
WorkOrder表
WorkOrderNumber ItemName ItemType
B2234 ZXC 1
B2234 ZXC-T 2
B2234 ZXC-C 3
场景:用户输入序列号,想要从生产表或工作订单表中获取itemtype = 1的项目名称
期望的结果
用户输入应用程序中的序列号1234:
ItemName:ASD [在生产表中找到]
用户输入应用程序中的序列号1111:
ItemName:ZXC [在工单表中找到]
为了演示目的,大大简化了生产和工作订单表。该表每行包含数百万行。我需要提出一个高性能的查询来获取项目名称。
我想到的唯一解决方案是执行以下操作
但我不确定这是否是首选的性能方法,而且我觉得将业务逻辑放在数据库中有点蠢。
如何优雅地处理这个问题?
答案 0 :(得分:1)
试试这个:
select top 1 pt.serialNumber,pt.workOrderNumber,
isNull(wt.ItemName,pt.ItemName) as NameToReturn
from prodTable pt
left join worktable wt on pt.WorkOrderNumber=wt.workOrderNumber and wt.itemType=1
where pt.serialNumber = <input>
order by p1.itemType
我不确定我是否了解您的所有要求,但上述内容应该为您提供一个起点。它在prodTable中找到该部件,并可选择在工作项表中找到一个部件。 Null逻辑假定如果Work表中存在类型1,则将使用它。如果您的规则不同(例如,prod表中的1应覆盖工作表),您可能需要将此调整为case语句