Azure Synapse 如何交叉应用 JSON 路径

Azure Synapse how to CROSS APPLY JSON PATH

我想根据来自另一个 table 的几个字段动态提取数据行,并在将其作为单行加入时将其汇总为 JSON。

这里有一个小例子来说明。

[测试].[dbo].[tableA]

Col1 Col2
1 i
2 ii
3 iii

[测试].[dbo].[tableB]

A_id B_Col1 B_Col2
1 b11 b12
1 b111 b112
2 b21 b22
2 b22 b222

查询:

      SELECT * FROM [Test].[dbo].[tableA] as A
        CROSS APPLY (
          SELECT (
              SELECT * FROM [Test].[dbo].[tableB] as B
              WHERE B.A_id = A.Col1
              FOR JSON PATH
          ) as B_JSON
      ) as CA

结果(如 SQL 服务器中预期的那样)

Col1 Col2 B_JSON
1 i [{"A_id":1,"B_Col1":"b11","B_Col2":"b12"},{"A_id":1,"B_Col1":"b111","B_Col2":"b112"}]
2 ii [{"A_id":2,"B_Col1":"b21","B_Col2":"b22"},{"A_id":2,"B_Col1":"b22","B_Col2":"b222"}]
3 iii NULL

Azure Synapse Serverless 中的结果 SQL 池

The query references an object that is not supported in distributed processing mode.

问题是,它不喜欢 FOR JSON 结果周围的 SELECT,但我们需要它来分配一个列名,以便交叉应用工作。

问题是这样的;在这种情况下实现这一目标的最佳方法是什么?

我无法在您的环境中对此进行测试,因此这可能行不通... 您可以尝试其中之一:

DECLARE @tblA TABLE(Col1 INT, Col2 VARCHAR(10));
INSERT INTO @tblA(Col1,Col2) VALUES
 (1,'i')
,(2,'ii')
,(3,'iii');

DECLARE @tblB TABLE(A_id INT,B_Col1 VARCHAR(10),B_Col2 VARCHAR(10));
INSERT INTO @tblB(A_id,B_Col1,B_Col2) VALUES
 (1,'b11','b12')
,(1,'b111','b112')
,(2,'b21','b22')
,(2,'b22','b222');

--在CA名称后面传递列名称(避免嵌套SELECT)

  SELECT * FROM @tblA as A
    CROSS APPLY (
          SELECT * FROM @tblB as B
          WHERE B.A_id = A.Col1
          FOR JSON PATH
      ) CA(B_JSON);

--使用标量子select

完全避免CA
  SELECT A.Col1
        ,A.Col2
        ,(
          SELECT * FROM @tblB as B
          WHERE B.A_id = A.Col1
          FOR JSON PATH
         ) AS B_JSON
  FROM @tblA as A;