【问题标题】:Join a query with CROSS APPLY FOR JSON PATH使用 CROSS APPLY FOR JSON PATH 加入查询
【发布时间】:2021-07-22 04:24:16
【问题描述】:

我有两个 SQL Server 表 ApplicationRolescommonformsschema。基于SchemaId 列在两个表之间应用连接。

但是FOR JSON PATH 列名称为roles 结果出错了。

这里是选择查询:

SELECT
    fs1.SchemaId, JSON_QUERY(ar.newJson) as roles 
FROM
    commonformsschema fs1 
JOIN 
    ApplicationRoles ar1 on ar1.SchemaId = fs1.SchemaId 
CROSS APPLY 
    (SELECT 
         (SELECT 
              RoleName AS [role], 
              [create] AS [permissions.create], 
              [read] AS [permissions.read],
              [update] AS [permissions.update],
              [delete] AS [permissions.delete] 
          FROM 
              ApplicationRoles ar 
          WHERE 
              fs1.SchemaId = ar1.SchemaId 
          FOR JSON PATH, WITHOUT_ARRAY_WRAPPER) AS newJson) ar 
WHERE
    fs1.Tenant IN ('test', 'All') 
    AND ar1.RoleName IN ('Project Manager', 'Read') 

完整表格详情请输入db fiddler

当前结果:

SchemaId roles
7a9a2521-45fb-4c9d-b7d9-e41927118119 {"role":"Senior Construction Manager","permissions":{"create":true,"read":true,"update":true,"delete":true}}
ca5d8707-fee8-4a5b-ad61-813785e32575 {"role":"Senior Construction Manager","permissions":{"create":true,"read":true,"update":true,"delete":true}}

预期结果:

SchemaId roles
7a9a2521-45fb-4c9d-b7d9-e41927118119 {"role":"Project Manager","permissions":{"create":true,"read":true,"update":false,"delete":true}}
ca5d8707-fee8-4a5b-ad61-813785e32575 {"role":"Project Manager","permissions":{"create":true,"read":true,"update":false,"delete":true}}

如何解决这个问题?请任何帮助。如果需要任何其他详细信息,请告诉我。

提前致谢。

【问题讨论】:

    标签: sql json sql-server tsql


    【解决方案1】:

    您只需加入表并为每一行生成预期的 JSON:

    SELECT 
       fs1.SchemaId,
       (
       SELECT
          ar1.RoleName AS [role],
          ar1.[create] AS [permissions.create],
          ar1.[read] AS [permissions.read],
          ar1.[update] AS [permissions.update],
          ar1.[delete] AS [permissions.delete] 
       FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
       ) AS roles
    FROM commonformsschema fs1 
    JOIN ApplicationRoles ar1 ON ar1.SchemaId = fs1.SchemaId 
    WHERE
       fs1.Tenant IN ('test', 'All') AND 
       ar1.RoleName IN ('Project Manager', 'Read') 
    

    结果:

    SchemaId roles
    7a9a2521-45fb-4c9d-b7d9-e41927118119 {"role":"Project Manager","permissions":{"create":true,"read":true,"update":false,"delete":true}}
    ca5d8707-fee8-4a5b-ad61-813785e32575 {"role":"Project Manager","permissions":{"create":true,"read":true,"update":false,"delete":true}}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多