如何提取SQL Server 2012中特定字段值混合的记录?
解决SQL Server 2012中提取ResaID对应RoomCat不全相同的行
嘿,针对你这张200万行的大表场景,我给你几个实用又高效的解决方案,既能精准满足需求,又能兼顾查询性能:
方法一:窗口函数法(直观易懂)
用窗口函数直接给每个ResaID计算不同RoomCat的数量,筛选出数量大于1的行即可:
SELECT ResaID, StayDate, RoomCat FROM ( SELECT ResaID, StayDate, RoomCat, -- 按ResaID分组,统计该组内不同RoomCat的数量 COUNT(DISTINCT RoomCat) OVER (PARTITION BY ResaID) AS DistinctCatCount FROM StayDateInfo ) AS SubQuery WHERE DistinctCatCount > 1;
这个方法逻辑清晰,子查询给每条记录打上所属ResaID的类别数量标签,外层直接过滤出类别数大于1的所有行,新手也能快速理解。
方法二:EXISTS关联法(大数据量更高效)
如果追求极致性能,推荐用EXISTS先定位符合条件的ResaID,再关联回原表取数据,避免全表统计的开销:
SELECT s.ResaID, s.StayDate, s.RoomCat FROM StayDateInfo s WHERE EXISTS ( -- 检查当前ResaID下是否存在不同的RoomCat记录 SELECT 1 FROM StayDateInfo s2 WHERE s2.ResaID = s.ResaID AND s2.RoomCat <> s.RoomCat );
这个写法的优势在于,只要找到同一ResaID下任意一条不同RoomCat的记录,就会停止查找,比统计所有类别数量更快,非常适合200万行的大表场景。
性能优化小提示
为了让查询速度再上一个台阶,建议给表创建一个联合索引:
CREATE NONCLUSTERED INDEX IX_StayDateInfo_ResaID_RoomCat ON StayDateInfo (ResaID, RoomCat) INCLUDE (StayDate); -- 包含需要查询的列,避免额外的键查找操作
这个索引能让数据库快速定位到每个ResaID对应的RoomCat记录,大幅减少查询时的IO开销。
内容的提问来源于stack exchange,提问作者user3115933
相关产品推荐
相关产品推荐

