我目前正在编制一个模式,负责存储产品、价格和利润。
我遇到的问题的症结在于如何最好地处理多个场景。
定义-所有这些都是链接(交叉)表中的字段
其中有些是可选的。总有一个产品保证金映射.其他字段的存在是为了定义更具体的关系。
规则将与层次结构一起应用。
示例:
这将由3行覆盖,填充的字段如下(未填充的字段为null)
第3条是最具体的,因此应优先考虑。
这个链接表是存储这些层次关系的最佳方法吗?如果不是,什么是?
构造查询以利用这一点的最佳方法是什么?我使用临时表和条件逻辑编写了一个查询,但我忍不住认为我是在与SQL挂钩,而且还有一种更好的方法来构造查询。
我想在SQL中保留同样多的逻辑,而不使用业务逻辑。
换句话说,应用程序可以调用一个存储过程,传入Product,以及可选的Authority和/or供应商,并获得适当的保证金。
发布于 2016-06-15 13:59:38
我认为,在您的示例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@-传递给存储过程的参数。我不知道您的解决方案是否需要联接,但是您可以将where条件更改为joins。
这假设产品总是作为参数传递,其他则是可选的(您可以在那里添加供应商和授权)。客户端意味着不为空的行出现在顶部,如果所有行的客户端列为空,则客户端组具有相同的逻辑。
或者您可以使用James的注释中建议的order方法。
发布于 2016-06-16 13:06:30
感谢您的输入,我想要的分层行为的解决方案如下所示:
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 DESChttps://stackoverflow.com/questions/37835944
复制相似问题