我有一个名为Weapons
的表,其中包含weaponIds
和weaponType
作为列。
| weaponIds | weaponType |
1 gun
2 gun
3 gun
4 tank
5 tank
6 bomb
7 bomb
8 bomb
我还有一个名为WeaponUsage
的表,其列分别为weaponIds
和userIds
。
| weaponIds | userIds |
1 user1
1 user2
2 user1
5 user2
6 user2
用户可以使用多种不同类型的武器。但是,用户仅应持有给定类型的一种武器。也就是说,用户不能拥有多个相同类型的武器。
由于我的系统受到攻击,因此我在第二个表中确实有一个实例,其中一个用户拥有多个相同类型的武器。
我想提出一份发现所有此类违规行为的报告。给定一个weaponType
,我的结果表应包含针对给定类型的userIds
的所有weaponIds
和该武器的数量。例如应该报告上面的user1,因为他有2种枪支武器,但是user2很好,因为他有多种武器但类型不同。
如何在单个sql查询中实现此目标?我有sql server作为数据库。
答案 0 :(得分:1)
请尝试以下查询:
select userid,count(distinct weapontype) from weapons a inner join WeaponUsage b
on a.weaponIds=b.weaponIds
group by userid
having count(distinct weapontype)>1
答案 1 :(得分:1)
SELECT
userIds,
count(distinct weaponType)
FROM
Weapons w
INNER JOIN
WeaponUsage wu
ON
w.weaponIds = wu.weaponIds
GROUP BY
userIds
HAVING
count(distinct weaponType) > 1
答案 2 :(得分:1)
这似乎对我分组:
WITH Weapons AS
(
SELECT * FROM (VALUES
(1, 'gun'),
(2, 'gun'),
(3, 'gun'),
(4, 'tank'),
(5, 'tank'),
(6, 'bomb'),
(7, 'bomb'),
(8, 'bomb')) T(weaponId, weaponType)
), WeaponUsage AS
(
SELECT * FROM (VALUES
(1, 'user1'),
(1, 'user2'),
(2, 'user1'),
(5, 'user2'),
(6, 'user2')) T(weaponId, userId)
)
SELECT userId, weaponType, COUNT(*) [#WeaponsOfType]
FROM Weapons W
JOIN WeaponUsage U ON W.weaponId=U.weaponId
GROUP BY userId, weaponType
HAVING COUNT(*)>1
结果:
userId weaponType #WeaponsOfType
------ ---------- --------------
user1 gun 2