2016-04-22 8 views
0

Books-CommunityBooks-Userの間に2つの多対多マッピングテーブルがあります。 UserIdをストアドプロシージャに渡すと、すべての書籍がユーザーの書籍に存在するすべてのコミュニティを取得するにはどうすればよいですか?リストが別のリストのサブセットである場合はsqlの行を選択

ユーザーブックス表

[UserId]----------------------------[BookId] 

fd95eff5-394e-4d51-b1af-46723268485f----27 

fd95eff5-394e-4d51-b1af-46723268485f----28 

fd95eff5-394e-4d51-b1af-46723268485f----35 

fd95eff5-394e-4d51-b1af-46723268485f----36 

fd95eff5-394e-4d51-b1af-46723268485f----40 

fd95eff5-394e-4d51-b1af-46723268485f----41 

fd95eff5-394e-4d51-b1af-46723268485f----56 

fd95eff5-394e-4d51-b1af-46723268485f----67 

fd95eff5-394e-4d51-b1af-46723268485f----88 

fd95eff5-394e-4d51-b1af-46723268485f----103 

fd95eff5-394e-4d51-b1af-46723268485f----104 

fd95eff5-394e-4d51-b1af-46723268485f----155 

fd95eff5-394e-4d51-b1af-46723268485f----156 

BooksCommunityMap

[BookId]-----[CommunityId] 

29-----------23 

30-----------23 

32-----------23 

34-----------23 

35-----------23 

36-----------23 

私はそれがすべての本だすべてのコミュニティを選択したいあなたは葦ここでは、ユーザーの本に

+3

あなたの質問を編集して、サンプルデータと望ましい結果を提供してください。 –

+0

@ GordonLinoff編集 –

+0

あなたは単に質問を逆さまにしています... –

答えて

1
;WITH cte as 
(
    SELECT UserID, CASE WHEN BookId IN (SELECT Id From @incomingTableValuedVariable) THEN 0 ELSE 1 END as NoBook 
    FROM MAPTABLE 
), 
cte2 as 
(
    SELECT UserID, MAX(NOBook) as NoBook 
    FROM cte 
    GROUP BY UserId 
) 
SELECT UserID 
FROM cte2 
WHERE NoBook = 0; 
+0

あなたのクエリを試しましたか? 「集計またはサブクエリを含む式に対して集計関数を実行できません」というエラーが表示されます。 – gofr1

+0

@ gofr1いいえ、回答を編集しました –

+0

@RuslanK。これは私に次のエラーを与えます "キーワード 'の近くに構文が正しくありませんこのステートメントが共通テーブル式、xmlnamespaces句または変更トラッキングコンテキスト句である場合、前のステートメントはセミコロンで終わらなければなりません。 セミコロンを追加しようとしましたが、エラーは同じです –

0

をすることができますが存在します約using a Table-Valued Parameters。私はあなたが必要なものを得るためにあなたのクエリの例を与える:

DECLARE @tvv TABLE (id int) 

INSERT INTO @tvv VALUES 
(1), 
(2) 

;WITH users_books AS (
SELECT * 
FROM (VALUES 
(1,1),(2,1),(3,1), 
(1,2),(2,2),(3,3), 
(1,3),(2,3),(3,5), 
(1,4),(2,4),(3,7), 
     (2,5),(3,8), 
     (2,6),(3,9) 
) as t (UserID, BookID) 
) 

SELECT UserID 
FROM users_books u 
LEFT JOIN @tvv i 
    ON i.id = u.BookID 
GROUP BY UserID 
HAVING COUNT(id) = (SELECT COUNT(*) FROM @tvv) 

出力:

UserID 
----------- 
1 
2 

(2 row(s) affected) 
+0

もしあなたが一冊の本(例えば 'bookId = 1')を持っていれば、'すべての本が渡されたリストに存在しますが、あなたはあなたの問い合わせには入りません。 ' –

+0

テーブルを返します1,2,3ユーザーIDで – gofr1

+0

もう一度引用した文を読んでください - すべての書籍が渡されたすべてのユーザーIDを取得する必要があります。 'すべての本のユーザーが渡されたリストに存在する – gofr1

関連する問題