SQL Server 2005如何查找拥有所有图书的用户
问题描述:
我正在尝试查询拥有所有计算机图书的用户。例如,我有两个表: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?
答
事情是这样的:
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))
换句话说,我们在寻找谁拥有那里不存在的项目,他们不拥有至少一个项目的不同用户。
答
我的解决方案的关键是除外条款。我对所有用户/书籍的可能性进行交叉连接,然后 - 除了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
)
答
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)
在您的示例数据,是USER_ID = 1你正在寻找的,因为它有computerbook1,computerbook2和computerbook3的人吗? – Griffin 2012-03-21 04:51:39
另外,为什么你不能使用计数?这是这个问题的一些要求吗?或者你只是假设计数不起作用? – Griffin 2012-03-21 04:56:20
@格里芬:谢谢你的回复,是的 – 2012-03-21 04:58:42