Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL按分组并合并json数组中的剩余列_Sql_Json_Sql Server_Tsql - Fatal编程技术网

TSQL按分组并合并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

我想按列对结果集进行分组,并将剩余的列合并到一个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","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"}]

实际上,你可以用光标来完成。。这不是最好的办法。。