如果你只有永遠需要有多個用戶的房間,那麼這將工作:
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相關聯,因此又更向前兼容。