2012-02-21 93 views
0

我在SQL Server 2008中的表有以下字段如何在SQL Server 2008中查詢兩個相同的值?

RoomUserId->Primary key 
RoomId->Foreign Key of Table Rooms 
UserId->Foreign Key of Table Users 

現在我有值以下,其中RoomId是常見的兩個用戶

RoomUserId RoomId UserId 
     1  11 1 
     2  11 2 
     3  12 1 
     4  12 3 
     5  13 1 
     6  13 4 

現在我需要一個SQL查詢來發現兩個用戶不同的是roomid。即用戶1和用戶2的roomid,用戶1和用戶3的用戶2,roomid

任何人都可以幫助我,因爲我是SQL Server的新手。

回答

0

試試這個:

SELECT r1.roomId FROM room r1 JOIN room r2 ON r1.roomId = r2.roomId WHERE r1.userId = 1 AND r2.userId = 3 
0

如果你的意思是找到一個roomid是共同的用戶:

select distinct f.roomid 
from rooms f 
inner join rooms s on f.roomid = s.roomid and f.userid <> s.userid 

或者你可以用分組:

select roomid 
from rooms 
group by roomid 
having count(distinct userid) > 1 
0

如果你只有永遠需要有多個用戶的房間,那麼這將工作:

SELECT DISTINCT RoomID 
FROM RoomUser r1 
     INNER JOIN RoomUser r2 
      ON r1.RoomID = r2.RoomID 
      AND r1.RoomUserID != r2.RoomUserID 

如果您需要包含x個用戶的房間的房間ID,則使用Having子句,這比自己加入的子項更具可擴展性。如果你需要找房的ID有3個或更多的用戶ID,那麼你最終會得到:

SELECT RoomID 
FROM RoomUser 
GROUP BY RoomID 
HAVING COUNT(DISTINCT UserID) > 3 

而使用自聯接,而可能更有效地將結束與一些相當混亂SQL。檢查執行計劃並運行一些測試,以查看哪些更適合您的需求。

如果你確實需要在房間的用戶的用戶ID與多個用戶ID,那麼你可以使用一個CTE建立一個逗號分隔的用戶的字符串中的每個房間:

;WITH RoomUserCTE AS 
( SELECT RoomID, 
      MIN(UserID) [UserID], 
      CONVERT(VARCHAR(20), MIN(UserID)) [Users], 
      0 [Recursion] 
    FROM RoomUser 
    GROUP BY RoomID 
    UNION ALL 
    SELECT a.RoomID, 
      b.UserID [UserID], 
      CONVERT(VARCHAR(20), Users + ', ' + CONVERT(VARCHAR, b.UserID)), 
      Recursion + 1 
    FROM RoomUserCTE a 
      INNER JOIN RoomUser b 
       ON a.RoomID = b.RoomID 
       AND b.UserID > a.UserID 
) 
SELECT RoomID, Users 
FROM ( SELECT *, MAX(Recursion) OVER(PARTITION BY RoomID) [MaxRecursion] 
      FROM RoomUserCTE 
     ) cte 
WHERE MaxRecursion = Recursion 

對於數據在你的問題,這將產生

| RoomID | Users | 
|---------+---------| 
| 11  | 1, 2 | 
| 12  | 1, 3 | 
| 13  | 1, 4 | 

這無論工作多用戶ID是如何與同一房間ID相關聯,因此又更向前兼容。