2012-03-21 10 views
3

すべてのコンピュータブックを持つユーザーにクエリを作成しようとしています。たとえば、私は2つのテーブルがあります。SQL Server 2005すべての書籍を持つユーザーを検索する方法

1)項目テーブル

|itemid |item_name   | 
------------------------------ 
|1  | computerbook1  |  
|2  | computerbook2  |  
|3  | computerbook3  | 
|4  | mathbook1   |  
|5  | mathbook2   |  
|6  | physicsbook  | 

2)userinventoryテーブルを

|used_id | name_item  | 
----------------------------- 
|1  | computerbook1 |  
|1  | computerbook2 |  
|1  | computerbook3 |  
|2  | computerbook1 |  
|2  | mathbook1  |  
|2  | physicsbook  |  
|3  | computerbook1 |  
|3  | computerbook3 | 

ユーザー "1" コンピュータの本のすべてを持っているので、私は、クエリを作成したいと思います私が何をしたか、ユーザ1

を返すことがあったと...

Create Table #tmp (
    Classname [varchar](50) NOT NULL 
) 

INSERT INTO #tmp 
SELECT DISTINCT item_name 
    FROM ITEM 
WHERE item_name like 'computerbook%' 
私はアイテムのすべてを持っているユーザーを検索し、比較したい

..

私はまたは任意のアグリゲーションを使用することはできませんので、しかし、私は...それを行う方法を実際に確認していません。

「カウント」

んを使用しないでくださいとにかくコンピュータの本のすべてを持っているユーザIDを見つけるための彼らの方法を知っていますか?

+0

それはcomputerbook1、computerbook2、およびcomputerbook3を持っているので、= 1あなたが探しているものをUSER_IDですか? – Griffin

+0

また、カウントを使用できないのはなぜですか?これは問題のいくつかの要件ですか?それとも、カウントがうまくいかないと仮定していますか? – Griffin

+0

@グリフィン:返信いただきありがとうございます。 –

答えて

1

このような何か:つまり

SELECT DISTINCT userid FROM userinventory WHERE NOT EXISTS (SELECT null 
    FROM item WHERE NOT EXISTS (SELECT null FROM userinventory i2 
     WHERE i2.name_item = item.item_name AND i2.user_id = userinventory.userid)) 

、我々は、彼らがいないが自分のやるという項目が存在しない少なくとも一つのアイテムを所有する個別のユーザーを探しています。

+0

このクエリは、0行が書き込まれたものとして返します。 – Griffin

+0

最も外側のサブクエリのitem.item_nameに述語を追加するとそのトリックが実行されます。 – Griffin

2

私の解決策の鍵はexcept節です。私は、すべてのユーザー/ブックの可能性を十字結合して、except節で、それらの可能性を満たさないすべてのユーザーのリストを取得します。つまり、A =すべての可能性、B =実際のデータ、そしてB以外のAはAの行が欠けているユーザーのみが含まれます。そこから、インベントリテーブルに表示されているサブユーザーではないユーザー-query。私はそれがかなり畳み込まれていることを認め、一時テーブルに分解することができます。あなたの例のデータで

SELECT user_id 
FROM userinventory 
EXCEPT 
(
    SELECT user_id 
    FROM (
     SELECT UX.user_id, II.item_name 
     FROM item II, (SELECT UU.user_id FROM userinventory UU) UX 
     WHERE II.item_name LIKE 'computerbook%' 
     EXCEPT 
     SELECT UU.user_id, UU.name_item 
     FROM userinventory UU 
     ) XX 
) 
0
declare @Item table(itemid int, item_name varchar(30)) 
insert @item values(1, 'computerbook1') 
insert @item values(2,'computerbook2') 
insert @item values(3,'computerbook3') 
insert @item values(4,'mathbook1') 
insert @item values(5,'mathbook2') 
insert @item values(6,'physicsbook') 

declare @userinventory table(user_id int, name_item varchar(30)) 
insert @userinventory values(1,'computerbook1') 
insert @userinventory values(1,'computerbook2') 
insert @userinventory values(1,'computerbook3') 
insert @userinventory values(2,'computerbook1') 
insert @userinventory values(2,'mathbook1') 
insert @userinventory values(2,'physicsbook') 
insert @userinventory values(3,'computerbook1') 
insert @userinventory values(3,'computerbook3') 

;with users as 
(
    select distinct user_id from @userinventory 
), books as 
(
    select item_name from @item 
    where item_name like 'computerbook%' 
), missingbooks as 
(
    select * from users cross join books 
    except 
    select user_id, name_item from @userinventory 
) 
select user_id from users 
where user_id not in (select user_id from missingbooks) 
関連する問題