2012-03-21 76 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) 
相關問題