级联层次连接条件

时间:2016-06-15 12:48:16

标签: sql-server join database-schema hierarchy intersection

我目前正在制作一个模式,负责存储产品,价格和利润。

我遇到的问题的关键是如何最好地处理多种情况。

定义 - 所有这些都是链接(交集)表中的字段

  • 产品 - 小部件
  • 保证金 - 表示如何更改购买的数据结构 价格确定零售价格。 (足够复杂,需要一个 单独的表)
  • 供应商 - 向我们提供产品的人
  • 权威 - 供应商的某人愿意
  • 客户 - 我们将零售的人
  • ClientGroup - 客户端集合

其中一些是可选的。总会有产品保证金映射。 存在其他字段以定义更具体的关系。

规则将以层次结构应用。

示例:

  1. 产品“Foo”的保证金为10%(适用于所有客户)
  2. 对于ClientGroup“ A组 Foo 的保证金为8%
  3. 对于作为“ A组 Foo 成员的客户“Bob's Burgers”,保证金为6%
  4. 这将包含3行,并填充以下字段(未填充的字段为空)

    1. 产品的保证金
    2. ClientGroup边距
    3. 客户保证金
    4. 规则3是最具体的,因此优先。

      此链接表是存储这些层次关系的最佳方式吗? 如果没有,那是什么?

      构建查询以利用此功能的最佳方法是什么?我已经使用临时表和条件逻辑编写了一个查询,但我不能帮助,但我认为我是正方形的SQL,并且有更好的方法来构造查询。

      我想在SQL中保留尽可能多的逻辑,而不是业务逻辑。

      换句话说,应用程序可以调用存储过程,传入产品,客户端以及可选的权限和/或供应商,并接收相应的保证金。

2 个答案:

答案 0 :(得分:1)

我认为在您的示例中还应填充2和3产品,否则该保证金将应用于客户端或客户端组的所有产品。

获得结果的查询可能是这样的:

SELECT TOP 1 Margin
FROM <table>
WHERE Product = @Product
AND COALESCE(Client,'') = COALESCE(@Client,Client,'')
AND COALESCE(ClientGroup,'') = COALESCE(@ClientGroup,ClientGroup,'')
ORDER BY Client DESC, ClientGroup DESC

@ - 传递给存储过程的参数。我不知道您的解决方案是否需要加入,但您可以更改加入的条件。

这假定产品总是作为参数传递,其他是可选的(您可以在那里添加供应商和权限)。 desc客户端的排序意味着非空行显示在顶部,如果客户端列对于所有行都为空,则客户端组的逻辑相同。

或者您可以按照James B的评论中建议的方法使用订单

答案 1 :(得分:0)

感谢输入人员,我想要的分层行为的解决方案看起来像这样:

SELECT TOP 1
FROM MarginLink
WHERE
  (
(-- Client selection
  (ClientId = @clientId)
  OR
  ClientGroupId = (SELECT ClientGroupId FROM ClientGroupClient WHERE ClientId = @clientId)
)
AND
(--Product Selection
  (@productID BETWEEN ProductIdFrom AND ProductIdTo)
  OR
  (ProductTypeId = @productTypeID)
  OR
  (ProductIdFrom IS NULL  AND ProductIdTo IS NULL )
)

AND
(-- Supplier
  (SupplierId = @supplierId)
  OR
  (MarginLink.SupplierId IS NULL)
)
AND
(-- Authority
  (AuthorityId = @authorityId)
  OR
  (MarginLink.AuthorityId IS NULL)
)

)
ORDER BY  ClientId DESC, ClientGroupId DESC,  ProductIdFrom DESC, ProductIdTo DESC, ProductTypeId DESC, SupplierId DESC, AuthorityId DESC