首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >级联分层连接条件

级联分层连接条件
EN

Stack Overflow用户
提问于 2016-06-15 12:48:15
回答 2查看 303关注 0票数 0

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

我遇到的问题的症结在于如何最好地处理多个场景。

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

  • 产品-A小部件
  • 保证金-一种数据结构,表示如何改变购买价格以确定零售价格。(复杂到需要一个单独的表)
  • 供应商-向我们提供产品的人
  • 权威-供货商欠下的人
  • 客户-某个我们会零售的人
  • ClientGroup -客户的集合

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

规则将与层次结构一起应用。

示例:

  1. 产品"Foo"的利润率为10% (适用于所有客户)
  2. ClientGroup“A组”Foo的利润率为8%
  3. 对于客户“鲍勃汉堡”,谁是“A组”Foo的成员有6%的利润率

这将由3行覆盖,填充的字段如下(未填充的字段为null)

  1. 产品-保证金
  2. 客户集团-保证金
  3. 客户保证金

第3条是最具体的,因此应优先考虑。

这个链接表是存储这些层次关系的最佳方法吗?如果不是,什么是?

构造查询以利用这一点的最佳方法是什么?我使用临时表和条件逻辑编写了一个查询,但我忍不住认为我是在与SQL挂钩,而且还有一种更好的方法来构造查询。

我想在SQL中保留同样多的逻辑,而不使用业务逻辑。

换句话说,应用程序可以调用一个存储过程,传入Product,以及可选的Authority和/or供应商,并获得适当的保证金。

EN

回答 2

Stack Overflow用户

发布于 2016-06-15 13:59:38

我认为,在您的示例2和3产品也应该填充,否则,这一边际适用于所有产品的客户或用户组。

获取结果的查询可能如下所示:

代码语言:javascript
复制
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

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

这假设产品总是作为参数传递,其他则是可选的(您可以在那里添加供应商和授权)。客户端意味着不为空的行出现在顶部,如果所有行的客户端列为空,则客户端组具有相同的逻辑。

或者您可以使用James的注释中建议的order方法。

票数 1
EN

Stack Overflow用户

发布于 2016-06-16 13:06:30

感谢您的输入,我想要的分层行为的解决方案如下所示:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37835944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档