SQL 内部连接与 For JSON 层次结构

VBO*_*SOV 8 sql t-sql sql-server stored-procedures

我正在尝试使用内部连接连接两个 SQL 表,然后从我的过程中将它们作为 JSON 返回。

我的选择语句是:

SELECT 
    @CustomerAddressesJSON =
        (SELECT              
             Address.AddressID, Address.CustomerID,
             Address.AddressTypeID, Address.IsPrimary,
             CountryID, StateID, CountyID, DistrictID,
             StreetID, StreetNumber, PostalCode,
             AdditionalInformation, AddressImageID,
             CreatedOn, CreatedBy
         FROM 
             [sCustomerManagement].[tCustomerAddresses] Address
         INNER JOIN 
             [sCustomerManagement].[tAddresses] AddressDetails ON Address.AddressID = AddressDetails.AddressID
         WHERE 
             CustomerID = @CustomerID
         FOR JSON AUTO)
Run Code Online (Sandbox Code Playgroud)

结果是这样的:

SELECT 
    @CustomerAddressesJSON =
        (SELECT              
             Address.AddressID, Address.CustomerID,
             Address.AddressTypeID, Address.IsPrimary,
             CountryID, StateID, CountyID, DistrictID,
             StreetID, StreetNumber, PostalCode,
             AdditionalInformation, AddressImageID,
             CreatedOn, CreatedBy
         FROM 
             [sCustomerManagement].[tCustomerAddresses] Address
         INNER JOIN 
             [sCustomerManagement].[tAddresses] AddressDetails ON Address.AddressID = AddressDetails.AddressID
         WHERE 
             CustomerID = @CustomerID
         FOR JSON AUTO)
Run Code Online (Sandbox Code Playgroud)

问题是我不希望数组 AddressDetails 中的信息被嵌套。那里的信息是否可能在外面,所以我可以接收 2 个平面对象,而没有嵌套信息?

谢谢

Par*_*ait 7

考虑使用带有点语法的 PATH 模式并将所有字段映射到Address,如docs 中所述。

SELECT 
    @CustomerAddressesJSON =
        (SELECT              
             a.AddressID AS 'Address.AddressID', a.CustomerID AS 'Address.CustomerID',
             a.AddressTypeID AS 'Address.AddressTypeID', a,IsPrimary AS 'Address.IsPrimary',
             d.CountryID AS 'Address.CountryID', d.StateID AS 'Address.StateID',
             d.CountyID AS 'Address.CountyID', d.DistrictID AS 'Address.DistrictID',
             d.StreetID As 'Address.StreetID', d.StreetNumber AS 'Address.StreetNumber', 
             d.PostalCode AS 'Address.PostalCode',
             d.AdditionalInformation AS 'Address.AdditionalInformation', 
             d.AddressImageID AS 'Address.AddressImageID',
             d.CreatedOn AS 'Address.CreatedOn', d.CreatedBy AS 'Address.CreatedBy'
         FROM 
             [sCustomerManagement].[tCustomerAddresses] a
         INNER JOIN 
             [sCustomerManagement].[tAddresses] d ON a.AddressID = d.AddressID
         WHERE 
             a.CustomerID = @CustomerID
         FOR JSON PATH)
Run Code Online (Sandbox Code Playgroud)

或者,使用派生表:

SELECT 
    @CustomerAddressesJSON =
        (SELECT m.* 
         FROM 
             (SELECT a.AddressID, a.CustomerID, a.AddressTypeID, a,IsPrimary,
                     d.CountryID, d.StateID, d.CountyID, d.DistrictID,
                     d.StreetID, d.StreetNumber, d.PostalCode,
                     d.AdditionalInformation, d.AddressImageID,
                     d.CreatedOn, d.CreatedBy
              FROM 
                   [sCustomerManagement].[tCustomerAddresses] a
              INNER JOIN 
                   [sCustomerManagement].[tAddresses] d ON a.AddressID = d.AddressID
              WHERE 
                    a.CustomerID = @CustomerID
             ) AS m
         FOR JSON AUTO)
Run Code Online (Sandbox Code Playgroud)