【问题标题】:Renaming a JSON column for a UNION为 UNION 重命名 JSON 列
【发布时间】:2020-10-01 17:02:41
【问题描述】:

备注:我的例子过于简化了。实际上,我正在处理一个巨大的查询。但是为了说明问题/错误,让我们求助于苹果和橙子。

我的原始查询如下所示:

SELECT 'FruitsCount' AS "Type", (SELECT count(id) as Counter, [Name] FROM Fruits group by name FOR JSON PATH) AS "Value"

这会导致类似的结果。我们将其称为Format A

|---------------------|------------------------------------------------------------------------------|
|        Type         |                                   Value                                      |
|---------------------|------------------------------------------------------------------------------|
|     FruitCount      |         [{"Counter":2, "Name":"Apple"},{"Counter":3, "Name":"Orange"}]       |
|---------------------|------------------------------------------------------------------------------|

但是,现在我想创建水果和蔬菜计数的联合。我的查询现在看起来像这样

(SELECT count(id) as Counter, [Name] FROM Fruits group by name
UNION
SELECT count(id) as Counter, [Name] FROM Vegetables group by name)
FOR JSON PATH

|---------------------|------------------------------------------------------------------------------|
|                           JSON_F52E2B61-18A1-11d1-B105-00805F49916B                                |
|---------------------|------------------------------------------------------------------------------|
|     [{"Counter":2, "Name":"Apple"},{"Counter":3, "Name":"Orange"},{"Counter":7, "Name":"Tomato"}]  |
|---------------------|------------------------------------------------------------------------------|

但是,我希望它采用以前的格式,其中我有一个类型和值列(格式 A)。

我尝试了以下操作:

SELECT 'FruitsCount' AS "Type", ((SELECT count(id) as Counter, [Name] FROM Fruits group by name
UNION
SELECT count(id) as Counter, [Name] FROM Vegetables group by name) FOR JSON PATH) as "Value"

但是,我收到了Error 156: Incorrect syntax near the keyword 'FOR'.

然后我尝试了以下方法:

SELECT 'FruitsAndVegCount' AS "Type", (SELECT count(id) as Counter, [Name] FROM Fruits group by name
UNION
SELECT count(id) as Counter, [Name] FROM Vegetables group by name FOR JSON PATH) as "Value"

但是,我收到了Error 1086: The FOR XML and FOR JSON clauses are invalid in views, inline functions, derived tables, and subqueries when they contain a set operator.

我一直试图让我的“联合化”查询采用格式 A。

更新 1:这是所需的输出

|---------------------|------------------------------------------------------------------------------------------------|
|        Type         |                                   Value                                                        |
|---------------------|------------------------------------------------------------------------------------------------|
|  FruitAndVegCount   | [{"Counter":2, "Name":"Apple"},{"Counter":3, "Name":"Orange"},{"Counter":7, "Name":"Tomato"}]  |
|---------------------|------------------------------------------------------------------------------------------------|

目标是只有一行,有 2 列(类型、值),其中类型是我指定的任何内容(即 FruitAndVegCount),值是由联合查询创建的 ResultSet 的 JSON。

【问题讨论】:

    标签: sql-server database tsql union


    【解决方案1】:

    如果我对问题的理解正确,可以选择以下语句:

    SELECT 
       [Type] = 'FruitAndVegCount',
       [Value] = (
          SELECT Counter, Name
          FROM (
             SELECT count(id) as Counter, [Name] FROM Fruits group by name
             UNION ALL
             SELECT count(id) as Counter, [Name] FROM Vegetables group by name
          ) t
          FOR JSON PATH
       )
    

    【讨论】:

    • 我用示例输出更新了我的原始帖子。最终我需要一行 2 列。
    • 谢谢!这样可行!只是让我对解决方案有了更多的了解。 t 本质上是派生表的别名吗?我认为这是让整个事情发挥作用的诀窍。
    • @MetalWing,是的,t 是一个别名。
    【解决方案2】:

    您可以使用两列 Type 和 Value 来完成,如下所示。像这样的

    select 'FruitAndVegCount' as [Type],
            (select [Counter], [Name] 
             from (select count(id) as Counter, [Name] from #Fruits group by [name] 
                   union all
                   select count(id) as Counter, [Name] from #Vegetables group by [name]) u
              for json path) [Value];
    

    输出

    Type                Value
    FruitAndVegCount    [{"Counter":2,"Name":"apple"},{"Counter":1,"Name":"pear"},{"Counter":2,"Name":"carrot"},{"Counter":1,"Name":"kale"},{"Counter":2,"Name":"lettuce"}]
    

    【讨论】:

    • 我用示例输出更新了我的原始帖子。最终我需要一行 2 列(类型、值)
    • 谢谢,但不幸的是,目标是单排!类型是自定义列,我称之为“FruitAndVegCount”,值列是水果和蔬菜计数的 JSON。
    • 第二列的命名方式略有不同。干杯:)
    猜你喜欢
    • 1970-01-01
    • 2020-02-06
    • 2021-03-22
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多