2012-03-16 6 views
0

私は、特定の部門の下でユーザーがアクセスできるすべての製品を見つけるためにSQLクエリを考え出すのに苦労しています。ユーザーと部門別にすべての製品を検索するSQLクエリ?

部門には多くの製品があります。

除算表はdivision_iddivision_nameです。

製品表はproduct_idproduct_nameおよびdivision_idです。

私は

user_iddivision_idproduct_idのような列を持つ別のテーブルと呼ばれるUserProductsを持っています。

ユーザーに製品を割り当てる際のUI部分では、最初に部門が選択され、次に選択された部門に基づいて製品が投入されます。

製品表の製品に加えて、製品ドロップダウンには、ALLと呼ばれるもう1つのオプションがあります。

製品のALLオプションを選択すると、その部門のすべての製品がユーザーに割り当てられます。

しかし、ユーザーの製品では、すべての製品のエントリを入力しません。

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

また、ユーザーは複数の部門にアクセスできます。したがって、ユーザーは部門Aのすべての製品にアクセスできますが、部門Bの2つの製品のみがアクセスできます。

このスキーマでは、

EDIT 1

私は、入力として、ユーザID、プロダクトIDを持つことになりますし、私は与えられた部門の下で、特定のユーザーがアクセスできるすべての製品を取得したいと思います。

入力:user_idは、 出力division_id:user_idのすべての製品のリストをして助けてください

をdivision_id。

+0

回答がまだありません。コメントや提案はありますか? : – ashishjmeshram

+0

あなたはあなたが持っていて期待したい(出力する)データを使用することを検討する必要があるかもしれません。 – Arion

+0

"部門Aのすべての製品にアクセスできますが、[部門B]それはただ一つの例(多くの中で)または明示的なビジネスルールですか? – onedaywhen

答えて

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

これはそれを行う必要があります:私たちはdivision_idとPRODUCT_ID一致、またはdivision_idが一致し、PRODUCT_IDのいずれかの両方がある-1(すべて対応するため、返却製品テーブル上にuser_productsテーブルから参加

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_idとdivision idに制限します。分割スワップの代わりに商品別に制限する場合など、入力を変更するには、最後の2行を変更するだけです。 up.division_id = ???? ( )up.product_id = ????

0

このスキーマは、後で複雑さを提案するのでお勧めできません。たとえば、ユーザーが1つの部門にすべての製品を持っているが、製品の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 
関連する問題