【发布时间】: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