【发布时间】:2011-10-02 13:48:38
【问题描述】:
我有一个对性能非常敏感的 SQL Server 数据库。我需要对以下问题做出有效的选择:
我有一个包含 4 个字段的简单表格:
ID [int, PK]
UserID [int, FK]
Active [bit]
GroupID [int, FK]
每个 UserID 可以在 Active='false' 的 GroupID 中出现多次(以及在多个 groupID 中),但在 Active='true' 时只能出现一次。
如:
(id,userid,active,groupid)
1,2,false,10
2,2,false,10
3,2,false,10
4,2,true,10
我需要从某个组中的表中选择所有不同的用户,它应该保存用户的最后一个活动状态。如果用户处于活动状态 - 它不应该返回用户的非活动状态,如果它在某个时间点是这样的。
天真的解决方案是双重选择 - 一个选择所有活动用户,然后一个选择所有未出现在第一个选择语句中的非活动用户(因为每个用户可能在某些时候处于非活动状态时间点)。但这会运行第一个选择(与活动用户一起)两次 - 这是非常不需要的。
有没有什么聪明的方法可以只选择一次来获得所需的查询?想法?
提前非常感谢!
【问题讨论】:
-
"last" 和 "point in time" 暗示了一些日期字段,但我没有看到。
-
还是id单调递增?
-
没错! ID 是自动递增的。
-
您展示了一个非规范化的数据集,其中 groupid 似乎依赖于 userid。这是您数据的准确表示,还是 groupid 可以在单个用户 ID 的记录中有所不同?
-
@Larry - GroupID 不依赖于 UserID。那些是独立的。每次使用都可能出现在多个组中,并且每个组可以包含同一用户的多个记录(以及与问题无关的其他字段)。数据已标准化。
标签: sql sql-server performance sqlperformance