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

SQL Server不重复关联表如何实现按用户生成对应电话明细JSON

优化方案

你原有代码的问题有两个:

  1. 生成JSON的子查询没有过滤对应用户ID,导致返回了全量用户的电话数据
  2. JSON子查询重复关联了#USERMASTER和#USERPHONE两张表,产生冗余查询

修改后的代码仅需要关联一次两张原始表即可实现预期效果:

BEGIN
DROP TABLE IF EXISTS #USERMASTER;
DROP TABLE IF EXISTS #USERPHONE;
CREATE TABLE #USERMASTER (ID INT, NAME VARCHAR(100));
CREATE TABLE #USERPHONE (ID INT, PHONENUMBER NUMERIC,PHONETYPE CHAR(1));
INSERT INTO #USERMASTER VALUES(1,'JOHN');
INSERT INTO #USERMASTER VALUES(2,'VICTOR');
INSERT INTO #USERPHONE VALUES(1,1356487965,'W');
INSERT INTO #USERPHONE VALUES(1,9841007493,'M');
INSERT INTO #USERPHONE VALUES(1,7255952105,'O');
INSERT INTO #USERPHONE VALUES(2,9874563212,'M');

WITH AllUserPhone AS (
    -- 仅在此处关联一次两张原始表,拿到所有明细数据
    SELECT 
        A.ID,A.NAME,B.PHONENUMBER,B.PHONETYPE,
        ROW_NUMBER() OVER(PARTITION BY A.ID ORDER BY A.ID) RN
    FROM #USERMASTER A 
    JOIN #USERPHONE B ON A.ID=B.ID
),
UserPhoneJson AS (
    -- 基于已关联的结果集聚合生成每个用户对应的专属JSON,无需重复查询原始表
    SELECT 
        ID,
        (SELECT ID,PHONETYPE,PHONENUMBER,NAME 
         FROM AllUserPhone t_inner 
         WHERE t_inner.ID = t_outer.ID 
         FOR JSON PATH) AS UserPhoneDetail_JSON
    FROM AllUserPhone t_outer
    GROUP BY ID
)
SELECT 
    a.ID,a.NAME,a.PHONENUMBER,a.PHONETYPE,
    j.UserPhoneDetail_JSON
FROM AllUserPhone a
INNER JOIN UserPhoneJson j ON a.ID = j.ID
WHERE a.RN = 1;
END

运行上述代码即可得到你需要的预期输出,且全程没有重复关联原始表。


内容的提问来源于stack exchange,提问作者SARAVANAN CHINNU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:15:02