我正在努力想出一个SQL查询来查找特定部门下用户可以访问的所有产品。
分部可以有很多产品。
分部表有division_id
和division_name
。
产品表格包含product_id
,product_name
和division_id
。
我有另一个名为UserProducts的表,其中有像
这样的列 user_id
,division_id
和product_id
。
在向用户分配产品时的UI部分中,首先选择分区,然后根据所选分区产品进行填充。
除了产品表中的产品外,产品下拉还有一个名为ALL的选项。
当选择产品的所有选项时,分部下的所有产品都将分配给用户。
但在用户产品中,我没有输入所有产品的条目。它只有一个条目,如
user_id = 1, division_id = 1 and product_id = -1
where -1 says its ALL products under division_id = 1
用户也可以访问许多部门。因此,用户可以访问A部门下的所有产品,但只能访问B部分下的两个产品。
现在,使用此架构,如何让部门内的用户可以访问所有产品?
编辑1
我将用户ID和产品ID作为输入,我希望在给定的部门下让给定用户可以访问所有产品。
输入:user_id,division_id 输出:user_id和division_id
列出的所有产品请帮忙。
答案 0 :(得分:1)
SELECT product_id, product_name and division_id
FROM Products AS P
WHERE EXISTS (
SELECT *
FROM UserProducts AS U
WHERE U.division_id = P.division_id
AND U.product_id = -1
)
UNION
SELECT product_id, product_name and division_id
FROM Products AS P
WHERE EXISTS (
SELECT *
FROM UserProducts AS U
WHERE U.division_id = P.division_id
AND U.product_id = P.product_id
);
答案 1 :(得分:0)
这应该这样做:
SELECT *
FROM user_products up
JOIN products p ON up.division_id = p.division_id AND (up.product_id = p.product_id OR up.product_id = -1)
WHERE up.user_id = ?????
AND up.division_id = ????
我们从user_products表连接到products表,其中division_id和product_id匹配,或者division_id匹配,product_id为-1(从而返回该分区的所有相应产品)。最后,我们将限制为特定的user_id和division id。只需更改最后两行以更改输入,例如,如果您希望按产品而非分配交换进行限制: up.division_id = ???? 对于 up.product_id = ????
答案 2 :(得分:0)
不建议使用此架构,因为它稍后会提出复杂性。例如,如果用户拥有1个部门中的所有产品,但其中一个产品被撤销,则必须删除-1条目并替换剩余的已分配产品。
但是,继续使用此架构,您需要通过存储过程获取产品,该过程检查值是否为-1,然后传递所有产品,否则只传递分配的产品。
Create PROCEDURE [dbo].[sp_UserProductsbyDivision]
@Division as nvarchar(50),
@User as int output
AS
BEGIN
SET @AllProductsFlag=(select min(product_id) from UserProducts where user_id=@user and division_ID=@Division)
if @AllProductsFlag=-1
Begin
--Select ALL products in that divsion
Select @User, Products.Product_ID from Products where division_id=@division
End
Else
Begin
Select UserProducts.User_ID, Product_ID from UserProducts where User_ID=@User and Division_ID = @Division
End
END
抱歉,我无法创建实际的架构并测试它,但我认为这应该会给你一个想法。必要时进行调试!
答案 3 :(得分:0)
SELECT DISTINCT
p.product_id,
p.whatever
FROM UserProducts up
INNER JOIN Product p ON up.product_id IN (-1, p.product_id)
WHERE up.user_id = @user_id
AND up.division_id = @division_id