2012-03-16 96 views
0

我很努力想出SQL查詢來查找特定部門下用戶可以訪問的所有產品。SQL查詢按用戶和部門查找所有產品?

一個部門可以有很多產品。

分區表有division_iddivision_name

產品表有product_id,product_namedivision_id

我有另一個表稱爲UserProducts在那裏我有一個像

user_iddivision_idproduct_id列。

在UI部分而分配的產品對用戶而言,分割選擇的第一,然後根據選擇的劃分的產品填充。

除了從產品表中的產品,該產品下拉有一個名爲所有多一個選擇。

當從產品中的所有選項被選擇的劃分下的所有產品被分配給用戶。

但在用戶的產品,我不進入的所有產品項目。它只有一個條目,如

user_id = 1, division_id = 1 and product_id = -1 
where -1 says its ALL products under division_id = 1 

此外,用戶還可以訪問多個部門。因此,用戶可以訪問組A下的所有產品,但在divison B.

現在只有兩種產品,這種模式我如何得到所有的產品可以訪問用戶在劃分的?

編輯1

我將有用戶ID和產品ID作爲輸入,我希望讓所有到下給出劃分給定用戶可以訪問的產品。

輸入:USER_ID,division_id 輸出:所有產品目錄由USER_ID和division_id

請幫助。

+0

還沒有人回答?任何意見或建議? :( – ashishjmeshram 2012-03-16 07:42:09

+0

您可能不得不考慮提供使用您有哪些數據並希望您期望(輸出) – Arion 2012-03-16 07:48:53

+0

「所以用戶可以訪問分部A下的所有產品,但只有兩個產品在divison [原文] B」 - 是這只是一個例子(很多)或明確的商業規則? – onedaywhen 2012-03-16 08:08:27

回答

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 
      ); 
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表連接到產品表,其中無論是division_id都和PRODUCT_ID匹配,或者division_id比賽和PRODUCT_ID爲-1(從而返回所有相應的產品爲該部門)。最後在最後我們限制到一個特定的user_id和分區ID。簡單地改變最後兩行來改變你的輸入,例如,如果你想限制產品而不是分割交換: up.division_id = ???? for up.product_id = ????

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 [email protected] and [email protected]) 

    if @AllProductsFlag=-1 
    Begin 
--Select ALL products in that divsion 
Select @User, Products.Product_ID from Products where [email protected] 
    End 
    Else 
    Begin 
Select UserProducts.User_ID, Product_ID from UserProducts where [email protected] and Division_ID = @Division 
    End   
END 

對不起,我一直沒能創造實際的架構和測試這一點,但我認爲這應該給你一個想法。根據需要調試!

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