-1

我一直在为 MSSQL 中的客户开发的资产数据库存在问题。它需要捕获Required Actions,例如Lifting Equipment在特定位置需要在购买后 6 个月进行检查。可以通过不同的Due Dates方式计算这些所需的操作,但为了简化,这里将根据它们计算Purchase Date

因此,为此我有一个名为的表tblActionsRequired,其中包含以下相关字段:

  • ActionID - 对于所需的操作
  • EquipmentCategoryIDor EquipmentTypeIDor EquipmentID- 所以这些字段中的任何一个都是必需的。有了这个,他们指定一个设备类别或设备类型或特定设备需要一个操作。例如,2kg 粉末消火栓是一种设备类型,它属于消防安全设备类别,并且可能有一个特定的 2kg 粉末消火栓,其资产编号为 PFH2KG001。
  • BasedAtID- 公司的分支机构或站点

理想情况下,我想做的是尽可能多地保留在一个查询中,而不是为每个组合创建单独的查询或视图,然后使用 UNION 将它们添加在一起。我还有其他几个类似的字段,可以通过这些字段对这些必需的操作进行分段,因此在这里使用联合似乎很简单,但我计算出我需要满足 48 种不同的组合,并可能为每个组合创建一个视图,然后将它们联合起来一起!

所以接下来我有tblEquipment包含以下相关键:

  • EquipmentID- 主键
  • EquipmentTypeID= 外键,该资产属于哪个设备类型
  • BasedAtID- 外键,资产位于哪个站点

然后Equipment Types属于Equipment Categories和类别然后允许构建具有父子关系的树结构,但是我认为我在创建一个vwCategoryTree使用以下字段调用的视图时已经充分注意了这些:

  • ParentCategoryID
  • EquipmentTypeID

这个视图已经过测试并且可以很好地检查出来,它穿过树结构并允许您EquipmentTypeIDEquipmentCategoryID.

我需要帮助的是如何根据 EquipmentCategoryID、EquipmentTypeID 或 EquipmentID 中的哪个字段具有值来在 tblActionsRequired 和 tblEquipment 之间进行某种条件连接。如果只能指定 EquipmentID 或 EquipmentTypeID,那么我认为这会起作用:

ON (tblActionsRequired.EquipmentID IS NOT NULL AND tblEquipment.EquipmentID = tblActionsRequired.EquipmentID) OR (tblActionsRequired.EquipmentTypeID IS NOT NULL AND tblActionsRequired.EquipmentTypeID = tblEquipment.EquipmentTypeID)

但是如何将第三个表带入此连接以适应 EquipmentCategoryID 或至少避免使用 UNION?

对不起,如果有什么不明白的,请尽管问!非常感谢你!

4

1 回答 1

1

一种可能的方法:

select ...
from tblEquipment e
left join vwCategoryTree c on e.EquipmentTypeID = c.EquipmentTypeID
join tblActionsRequired r 
  on (e.EquipmentID = r.EquipmentID or 
      e.EquipmentTypeID = r.EquipmentTypeID or 
      c.ParentCategoryID = r.EquipmentCategoryID)
于 2013-04-03T11:59:59.377 回答