Sql 选择作为JSON联接表

Sql 选择作为JSON联接表,sql,sql-server,json,sql-server-2017,Sql,Sql Server,Json,Sql Server 2017,我想将两个表中的数据选择为一个json字符串。第一个表应该列出第二个表中的所有链接表,如 第一张表: SELECT [orderNumber], [tcpState] FROM [Tracking] 第二张表: SELECT [startdate], [enddate], [tcpState], [orderNumber], [name] FROM [Stations] 跟踪可以链接多个站点 预期结果: [{ "orderNumber": 123455, "

我想将两个表中的数据选择为一个json字符串。第一个表应该列出第二个表中的所有链接表,如

第一张表:

SELECT [orderNumber], [tcpState] 
FROM [Tracking]
第二张表:

SELECT [startdate], [enddate], [tcpState], [orderNumber], [name]
FROM [Stations]
跟踪可以链接多个站点

预期结果:

[{
        "orderNumber": 123455,
        "tcpState": 3,
        "Stations": [{
                "startdate": "2011-05-06",
                "enddate": "2012-09-15",
                "tcpState": 3,
                "name": "Roger"
            },
            {
                "startdate": "2011-02-06",
                "enddate": "2012-05-15",
                "tcpState": 4,
                "name": "Hans"
            }
        ]
    },
    {
        "orderNumber": 1566,
        "tcpState": 3,
        "Stations": [{
                "startdate": "2011-06-06",
                "enddate": "2012-08-15",
                "tcpState": "6",
                "name": "Mike"
            },
            {
                "startdate": "2011-03-06",
                "enddate": "2012-03-15",
                "tcpState": "6",
                "name": "Tom"
            }
        ]
    }
]
好的,首先你强迫我在我的linux上安装sql server 2017只是为了测试查询,因为没有可用的在线测试仪,所以我有点恨你,但是谢谢,Docker在那里


有两种方法可以做到这一点:

简单的一个,你在困难的一个之后发现 使用

最难的是,你自己制作JSON /!\这将仅使用SQL server 2017及其后的函数/\


您的SQL server版本是什么?您尝试过什么吗?SQL Express 2017。我不知道怎么做。避开第二条路。太多的注射空间,不管是意外的还是其他的。@LoztInSpace嘿,这第二条路是用爱创造的:<。但是,是的,如果你可以使用第一个,去爱它。爱还是不,仍然是一个危险的方法-对不起:(考虑一下什么叫“代码> LoZT”),在“空间< /代码>中,引用会做。抱歉给SQLServer带来不便。第一个是一个好的和快速的解决方案。谢谢!@ RoGerBurauEnStun OK,别忘了将你的问题标记为“已解决”);
SELECT 
    [Tracking].[orderNumber], 
    [Tracking].[tcpState],  
    [Stations].[startdate],
    [Stations].[enddate],
    [Stations].[tcpState],
    [Stations].[name]
FROM [Tracking]
LEFT JOIN [Stations] 
    ON [Tracking].[orderNumber] = [Stations].[orderNumber]
FOR JSON AUTO
SELECT 
    '['+iif(STRING_AGG(t1.[orderNumber],',') IS NOT NULL, 
        STRING_AGG(
        '{'+
        '"orderNumber":'+CONVERT(varchar(10), t1.[orderNumber])+','+
        '"tcpState":'+CONVERT(varchar(10), t1.[tcpState])+','+
        '"Stations":'+t1.Stations+
        '}'
        , ','), '')+
    ']' json
FROM
(
    SELECT 
    t.[orderNumber], 
    t.[tcpState],  
    '['+ iif(STRING_AGG(s.[orderNumber],',') IS NOT NULL, 
        STRING_AGG(
        '{'+
        '"startdate":"'+s.[startdate]+'",'+
        '"enddate":"'+s.[enddate]+'",'+
        '"tcpState":'+CONVERT(varchar(10), s.[tcpState])+','+
        '"name":"'+s.[name]+'"'+
        '}'
        , ','), '')+']' Stations
    FROM [Tracking] t
    LEFT JOIN [Stations] s ON t.[orderNumber] = s.[orderNumber]
    GROUP BY t.[orderNumber], t.[tcpState]
) t1
GROUP BY t1.[orderNumber]