【问题标题】:Azure Synapse how to CROSS APPLY JSON PATHAzure Synapse 如何跨应用 JSON 路径
【发布时间】:2021-07-10 17:12:38
【问题描述】:

我想根据另一个表中的几个字段动态提取数据行,并在将其作为单行加入时将其汇总为 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 Server 中符合预期)

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 池中的结果

查询引用了分布式中不支持的对象 处理模式。

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

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

【问题讨论】:

  • 如果你自己尝试内部查询会发生什么
  • 澄清一下,像上面示例中最内层 select 这样的语句来生成 JSON 可以工作 @Charlieface ,但是要包装它另一个 SELECT 来给它一个列名失败,并出现上面引用的错误

标签: json sql-server tsql azure-synapse


【解决方案1】:

我无法在您的环境中对此进行测试,因此这可能不起作用... 您可以尝试以下方法之一:

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);

--通过使用标量子选择完全避免 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;

【讨论】:

  • 感谢@Shnugo,非常感谢您的尝试,很好的建议。不幸的是,两者都在 Synapse SQL on-demand 中导致相同的错误(“查询引用了分布式处理模式不支持的对象”)。很想知道为什么 - 认为这需要去产品团队找出答案。
  • 看起来他们现在已经在 Azure Synapse Serverless SQL 池中实现了这一点,并且可以按预期工作。
猜你喜欢
  • 2021-09-01
  • 2021-11-11
  • 2023-01-22
  • 2021-12-03
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
相关资源
最近更新 更多