You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多无关联表数据查询:Union/Join、排序分页及存储过程技术问询

解决跨无关联表查询、合并、排序分页的问题

看起来你已经有了一个能精准匹配需求的存储过程,咱们来详细拆解它的逻辑,以及需要留意的关键细节:

这个P24GamesByCategoryDesktopEn存储过程完美实现了你要的功能——从两个无关联表中查询指定类型的游戏数据,合并结果后完成排序和分页操作。

核心逻辑拆解

  1. 跨表查询与结果合并
    用UNION ALL把BGames和EGame的查询结果无缝合并:

    • 从BGames表筛选出GameType = 'slots'的记录,取出游戏名称、380x380规格封面图、游戏编码,同时固定标记提供商ID为'9'
    • 从EGame表筛选出Type = 'slots'的记录,取出对应字段(Name对应游戏名称、ImageUrl对应封面图、GameID对应游戏编码),固定标记提供商ID为'12'
    • 这里选用UNION ALL而非UNION,是因为它不会做去重校验,性能更高效;如果你的业务场景需要剔除重复数据,可以换成UNION,但要确保重复判断的列符合业务预期
  2. 排序与分页实现

    • 合并后的结果通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:01:22