Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2005如何查找拥有所有书籍的用户_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

SQL Server 2005如何查找拥有所有书籍的用户

SQL Server 2005如何查找拥有所有书籍的用户,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我正在尝试查询拥有所有计算机书籍的用户。例如,我有两个表: 1) 项目表 |itemid |item_name | ------------------------------ |1 | computerbook1 | |2 | computerbook2 | |3 | computerbook3 | |4 | mathbook1 | |5 | mathbook2

我正在尝试查询拥有所有计算机书籍的用户。例如,我有两个表:

1) 项目表

|itemid |item_name          |
------------------------------
|1      | computerbook1     |    
|2      | computerbook2     |    
|3      | computerbook3     |
|4      | mathbook1         |    
|5      | mathbook2         |    
|6      | physicsbook       | 
2) 用户库存表

|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子句。我对所有用户/书籍的可能性进行交叉连接,然后使用except子句获得所有不满足这些可能性的用户的列表。即A=所有可能,B=实际数据,除B之外的A仅包含A中缺少行的用户。从那里,我查询库存表中表示的所有用户,这些用户不在子查询中返回的用户中。我承认这很复杂,可以用分解成临时表

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
)

在您的示例数据中,user_id=1是否就是您要查找的用户,因为它有computerbook1、computerbook2和computerbook3?另外,为什么不能使用count?这是问题的某些要求吗?还是你只是假设计数不起作用?@Griffin:谢谢你的回答,是的,这是问题的一个要求。如果(a)用户库存表保存的是书籍的itemid,而不是它的名称,(b)你在items表中添加了一个字段,指定了书籍的主题类型,那么解决这个问题就容易多了。理想情况下,您还应该有一个“subjects”表。此查询返回的行数为0。将item.item_name上的谓词添加到最外层的子查询中即可。
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)