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;
我想根据来自另一个 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;