我目前正在制作一个模式,负责存储产品,价格和利润。
我遇到的问题的关键是如何最好地处理多种情况。
其中一些是可选的。总会有产品保证金映射。 存在其他字段以定义更具体的关系。
规则将以层次结构应用。
示例:
这将包含3行,并填充以下字段(未填充的字段为空)
规则3是最具体的,因此优先。
此链接表是存储这些层次关系的最佳方式吗? 如果没有,那是什么?
构建查询以利用此功能的最佳方法是什么?我已经使用临时表和条件逻辑编写了一个查询,但我不能帮助,但我认为我是正方形的SQL,并且有更好的方法来构造查询。
我想在SQL中保留尽可能多的逻辑,而不是业务逻辑。
换句话说,应用程序可以调用存储过程,传入产品,客户端以及可选的权限和/或供应商,并接收相应的保证金。
答案 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