【问题标题】:JSON for multiple parent table's and one child table多个父表和一个子表的 JSON
【发布时间】:2020-11-27 14:51:11
【问题描述】:

以这样一种方式生成 JSON,即子表的 JSON 应该有 ARRAY_WRAPPER,而父表的 JSON 不应该有 ARRAY_WRAPPER 并且查询应该在 ('kumar,pathan') 中列 P1NAME 的 PARENT1 表上,所以输出应该有 2 行

我有下面提到的表格

CREATE TABLE [dbo].[Z_PARENT1](
    [P1id] [int] IDENTITY(1,1) NOT NULL,
    [P1NAME] [varchar](50) NULL
)

CREATE TABLE [dbo].[Z_PARENT2](
    [P2id] [int] IDENTITY(1,1) NOT NULL,
    [P1id] [int] NOT NULL,
    [P2NAME] [varchar](50) NULL
)

CREATE TABLE [dbo].[Z_CHILD](
    [Cid] [int] IDENTITY(1,1) NOT NULL,
    [P1id] [int] NOT NULL,
    [CNAME] [varchar](50) NULL
)

INSERT INTO [dbo].[Z_PARENT1] ([P1NAME]) VALUES ('kumar'), ('pathan') , ('chris')
INSERT INTO [dbo].[Z_PARENT2] ([P1id],[P2NAME]) VALUES (1,'Mrs.kumar'), (2,'Mrs.pathan') , (3,'Mrs.chris')
INSERT INTO [dbo].[Z_CHILD] ([P1id],[CNAME]) VALUES (1,'A_kumar'),(1,'B_kumar'),(2,'X_pathan'),(2,'Y_pathan') 

查询应该在 ('kumar,pathan') 中 P1NAME 列的 PARENT1 表上,所以 查询输出 应该有 2 行,
第 1 行应如下所示

 {
      "PARENT1":{"P1id":1,"P1NAME":"kumar"},
      "PARENT2":{"P2NAME":"Mrs.kumar"},
      "CHILD":[{"Cid":1,"P1id":1,"CNAME":"A_kumar"},{"Cid":2,"P1id":1,"CNAME":"B_kumar"}]
    }

Row2 应该如下所示

 {
      "PARENT1":{"P1id":2,"P1NAME":"pathan"},
      "PARENT2":{"P2NAME":"Mrs.pathan"},
      "CHILD":[{"Cid":3,"P1id":2,"CNAME":"X_pathan"},{"Cid":4,"P1id":2,"CNAME":"Y_pathan"}]
    }

请注意:(重要)

  1. 我应该能够在列 P1NAME IN ('kumar,pathan') 条件下查询 PARENT1 表,因此输出应该有 2 行
  2. 只有孩子应该有 JSON 数组。 (我的意思是 ARRAY_WRAPPER)和 parent1 和 parent2 不应该有数组(我的意思是 WITHOUT_ARRAY_WRAPPER)
  3. 父子节点之间应该存在左连接,因为如果子节点没有行,则至少应该构造父 JSON。
  4. 由于 parent1 和 parent2 是主表,所以 pid 应该有内部连接

【问题讨论】:

    标签: sql-server jsonpath


    【解决方案1】:

    如果我正确地关注了您,以下查询将产生您在问题中要求的结果。

    SELECT (SELECT TOP 1 IP1.P1id, IP1.P1NAME
            FROM dbo.Z_PARENT1 IP1
            WHERE IP1.P1id = P1.P1id
            FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER) AS PARENT1,
            (SELECT TOP 1 IP2.P2NAME
            FROM dbo.Z_PARENT2 IP2
            WHERE IP2.P1id = P1.P1id
            FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER) AS PARENT2,
            (SELECT *
            FROM dbo.Z_CHILD IC
            WHERE IC.P1id = P1.P1id
            FOR JSON AUTO) AS CHILD
    FROM [dbo].[Z_PARENT1] P1
    FOR JSON AUTO
    

    此查询未完全优化,但可以用作潜在的解决方案。

    重要的是要说,因为你有多行它不能是一个对象,它应该是一个数组作为全局结果。您可以轻松扩展此查询并放置 where 子句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 2012-06-05
      相关资源
      最近更新 更多