TSQL按分组并合并json数组中的剩余列
我想按列对结果集进行分组,并将剩余的列合并到一个json数组中,但我不确定如何为此聚合结果 我想要以下输出:TSQL按分组并合并json数组中的剩余列,sql,json,sql-server,tsql,Sql,Json,Sql Server,Tsql,我想按列对结果集进行分组,并将剩余的列合并到一个json数组中,但我不确定如何为此聚合结果 我想要以下输出: A_ID | Translations -------------------- 1 | [{"Name": "english_1","LCID": "en-gb"},{"Name": "french_1","LCID": "fr-fr"}] 2 | [{"Name": "english_2","LCID": "en-gb"},{"Name": "french_2","LCI
A_ID | Translations
--------------------
1 | [{"Name": "english_1","LCID": "en-gb"},{"Name": "french_1","LCID": "fr-fr"}]
2 | [{"Name": "english_2","LCID": "en-gb"},{"Name": "french_2","LCID": "fr-fr"}]
但是我不能在没有聚合器的情况下按_ID对结果进行分组,因此我得到以下结果
A_ID | Translations
--------------------
1 | [{"Name": "english_1","LCID": "en-gb"}]
1 | [{"Name": "french_1","LCID": "fr-fr"}]
2 | [{"Name": "english_2","LCID": "en-gb"}]
2 | [{"Name": "french_2","LCID": "fr-fr"}]
以下是一个例子:
如果存在tabA,则删除表格;
如果存在tabB,则删除表;
如果存在tabC,则删除表格;
去
创建表tabA
Id int不为空
;
创建表选项卡转换
translationId int不为null,
名称nvarchar32不为空,
aId int not null,-外键。
languageId int不为null-外键
;
创建表格语言
languageId int不为null,
LCID nvarchar32不为空
;
去
插入到tabA Id中
价值观
1.
2.
插入到tabTranslations translationId、Name、aId、languageId中
价值观
1,‘英语1’,1,1,
2,'法语1',1,2,
三、英语二、二、一、,
4,‘法语2’,2,2;
插入表格语言languageId,LCID
价值观
1,‘en gb’,
2,‘fr-fr’;
去
选择
_a、 身份证作为身份证,
选择
_翻译。姓名,
_语言.LCID
对于json路径
从塔巴作为a
内部连接选项卡转换为_translationon _translation.aId=_a.Id上的_translation
内部连接表格语言作为_languageon _language.languageId=_translation.languageId上的_language
-分组依据a.Id??
;
去
如果存在tabA,则删除表格;
删除表(如果存在);
如果存在表格语言,则删除表格;
去
替代解决方案:
我知道我可以做到这一点,但我显然不想硬编码可用的LCID,也许我可以生成sql查询并执行它?但这感觉太复杂了,我更喜欢数组
select
_a.Id as A_ID,
(
SELECT
MAX(CASE WHEN [LCID] = 'en-gb' THEN [Name] END) 'en-gb',
MAX(CASE WHEN [LCID] = 'fr-fr' THEN [Name] END) 'fr-fr'
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
) as b
from #tabA as _a
inner join #tabTranslations as _translation ON _translation.aId = _a.Id
inner join #tabLanguages as _language ON _language.languageId = _translation.languageId
group by _a.Id;
结果:
A_ID | Translations
--------------------
1 | { "en-Gb": "english_1", "fr-FR": "french_1"}
2 | { "en-Gb": "english_2", "fr-FR": "french_2"}
如果我理解正确,下一种方法可能会有所帮助。使用额外的交叉应用运算符和FOR JSON PATH可获得预期结果: 声明:
SELECT *
FROM #tabA AS t
CROSS APPLY (
SELECT _translation.Name AS Name, _language.LCID AS LCID
FROM #tabA _a
inner join #tabTranslations as _translation ON _translation.aId = _a.Id
inner join #tabLanguages as _language ON _language.languageId = _translation.languageId
WHERE _a.Id = t.Id
for json path
) _c(Translations)
输出:
Id Translations
1 [{"Name":"english_1","LCID":"en-gb"},{"Name":"french_1","LCID":"fr-fr"}]
2 [{"Name":"english_2","LCID":"en-gb"},{"Name":"french_2","LCID":"fr-fr"}]
实际上,你可以用光标来完成。。这不是最好的办法。。