SQL Query按用户和部门查找所有产品?

时间:2012-03-16 07:21:31

标签: sql

我正在努力想出一个SQL查询来查找特定部门下用户可以访问的所有产品。

分部可以有很多产品。

分部表有division_iddivision_name

产品表格包含product_idproduct_namedivision_id

我有另一个名为UserProducts的表,其中有像

这样的列

user_iddivision_idproduct_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

列出的所有产品

请帮忙。

4 个答案:

答案 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