2012-03-21 75 views
3

我正在尝试查询拥有所有计算机图书的用户。例如,我有两个表: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

在您的示例数据,是USER_ID = 1你正在寻找的,因为它有computerbook1,computerbook2和computerbook3的人吗? – Griffin 2012-03-21 04:51:39

+0

另外,为什么你不能使用计数?这是这个问题的一些要求吗?或者你只是假设计数不起作用? – Griffin 2012-03-21 04:56:20

+0

@格里芬:谢谢你的回复,是的 – 2012-03-21 04:58:42

回答

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 2012-03-21 05:35:26

+0

在最外面的子查询中的item.item_name上添加谓词就可以做到这一点。 – Griffin 2012-03-21 05:45:00

2

我的解决方案的关键是除外条款。我对所有用户/书籍的可能性进行交叉连接,然后 - 除了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) 
相关问题