首页 > 解决方案 > SQL Server:如何将所有行作为 Json 对象查询到其他列旁边?

问题描述

我有这样的数据: 在此处输入图像描述

我想查询这样的结果: 在此处输入图像描述

这是我的代码

SELECT
     PML_CODE
    ,PML_NAME_ENG
    ,(
        SELECT
              PML_ID
             ,PML_NO
             ,PML_CODE
             ,PML_NAME_ENG
             ,PML_FORMULA
        FROM DSP.PARAMET_LIST AS A WITH(NOLOCK)
        WHERE A.PML_ID = B.PML_ID 
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    ) AS BR_OBJECT
FROM DSP.PARAMET_LIST AS B WITH(NOLOCK)

我的代码适用于我想要的,但我想知道是否有更好、更快的方法来编写这个查询?

标签: jsonsql-servertsql

解决方案


下次请不要发布图片,而是尝试创建一些 DDL,用示例数据填充它,并说明您自己的尝试和预期的输出。这使我们更容易理解和回答您的问题。

你可以这样尝试:

DECLARE @tbl TABLE(PML_ID BIGINT, PML_NO INT, PML_CODE VARCHAR(10), PML_NAME_ENG VARCHAR(10), PML_FORMULA VARCHAR(10));
INSERT INTO @tbl VALUES
 (2017102600050,1,'KHR','Riel','01')
,(2017102600051,2,'USD','Dollar','02')
,(2017102600052,3,'THB','Bath','05')

SELECT
     PML_CODE
    ,PML_NAME_ENG
    ,BR_OBJECT
FROM @tbl
CROSS APPLY(
    SELECT
    (
            SELECT
                  PML_ID
                 ,PML_NO
                 ,PML_CODE
                 ,PML_NAME_ENG
                 ,PML_FORMULA
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    )) AS A(BR_OBJECT);

与您自己的方法的最大区别在于,我使用CROSS APPLY我们已经拥有的列而不是调用相关子查询


推荐阅读