多无关联表数据查询:Union/Join、排序分页及存储过程技术问询
解决跨无关联表查询、合并、排序分页的问题
看起来你已经有了一个能精准匹配需求的存储过程,咱们来详细拆解它的逻辑,以及需要留意的关键细节:
这个P24GamesByCategoryDesktopEn存储过程完美实现了你要的功能——从两个无关联表中查询指定类型的游戏数据,合并结果后完成排序和分页操作。
核心逻辑拆解
跨表查询与结果合并
用UNION ALL把BGames和EGame的查询结果无缝合并:- 从
BGames表筛选出GameType = 'slots'的记录,取出游戏名称、380x380规格封面图、游戏编码,同时固定标记提供商ID为'9' - 从
EGame表筛选出Type = 'slots'的记录,取出对应字段(Name对应游戏名称、ImageUrl对应封面图、GameID对应游戏编码),固定标记提供商ID为'12' - 这里选用
UNION ALL而非UNION,是因为它不会做去重校验,性能更高效;如果你的业务场景需要剔除重复数据,可以换成UNION,但要确保重复判断的列符合业务预期
- 从
排序与分页实现
- 合并后的结果通过
ORDER BY GameName按游戏名称做升序排序(需要降序的话,加上DESC即可) - 用
OFFSET @Index ROWS FETCH NEXT 4 ROWS ONLY实现分页逻辑:@Index是需要跳过的行数,比如第一页传0(跳过0行,取前4条),第二页传4(跳过前4条,取接下来的4条),以此类推就能实现连续分页
- 合并后的结果通过
重要注意事项
- 列一致性要求:使用
UNION/UNION ALL时,两个子查询返回的列必须完全匹配——数量相同、顺序一致、数据类型兼容(比如BGames.GameName和EGame.Name最好都是NVARCHAR类型,避免隐式转换拖慢查询性能) - 性能优化建议:如果两张表的数据量较大,建议给筛选条件字段(
BGames.GameType、EGame.Type)和排序字段(BGames.GameName、EGame.Name)建立非聚集索引,减少全表扫描的开销 - 分页参数校验:调用存储过程时,要确保
@Index是非负整数,避免无效参数导致查询报错
完整的存储过程代码如下:
CREATE PROCEDURE [dbo].[P24GamesByCategoryDesktopEn] @Index int AS Begin SELECT GameName, IMG380X380, GameCode, '9' AS ProviderID FROM BGames WHERE GameType = 'slots' UNION ALL SELECT Name, ImageUrl, GameID , '12' AS ProviderID FROM EGame WHERE Type = 'slots' ORDER BY GameName OFFSET @Index ROWS FETCH NEXT 4 ROWS ONLY END
内容的提问来源于stack exchange,提问作者dan mann
相关产品推荐
相关产品推荐

