在单行上显示相关的子记录

时间:2018-11-18 18:44:46

标签: tsql

在我熟悉的数据库中,列出父母和孩子的查询看起来像这样:

Parfirst ParLast Childfirst
玛丽·史密斯·莎莉
玛丽·史密斯·吉姆
玛丽·史密斯·金

但是,有人要求我创建一个如下所示的报告:

Parfirst ParLast Child1 Child2 Child3 Child4
玛丽·史密斯·莎莉·吉姆·金

我对如何做到这一点不知所措。欢迎任何建议。

1 个答案:

答案 0 :(得分:0)

您可以使用STRING_AGG函数(如果使用的是SQL Server 2017或更高版本)执行此操作,也可以使用FOR XML进行一些难看的XML魔术操作:

function run_ajax(make) {
    var results = $( '#results' );
    var msg = "";
    $.ajax({
        type: 'get',
        url: 'ajax.php',
        data: make,
        dataType: 'json',
        beforeSend: function() {
          console.log("Before Send");
        },
        success: function( response ) {
          console.log("Success!");
          for(var x in response) {
            if(response[x].make == make) {
              msg += response[x].model + "<br>";
            }
          }
          if(msg == "") {
            msg = "No matches found!";
          }
          document.getElementById("results").innerHTML = msg;
        },
    });
};

如果要在其自己的列中包括每个子名称,则必须在查询中定义这些列,如果定义的列数超过了该数目,则将无法返回任何其他子名称。像这样使用ROW_NUMBER

SELECT t.ParFirst, t.ParLast, LEFT(t.Children, Len(t.Children)-1) As Children
FROM
    (
        SELECT DISTINCT p.ParFirst, p.ParLast, 
            (
                SELECT c.ChildFirst + ',' AS [text()]
                FROM dbo.Children c
                WHERE c.ParentId = p.ParentId
                ORDER BY c.ChildFirst
                FOR XML PATH ('')
            ) l
        FROM dbo.Parents p
    ) t

SELECT p.ParFirst, p.ParLast, STRING_ACC(c.ChildFirst, ',') as Children
FROM dbo.Parents p
LEFT JOIN dbo.Children c on c.ParentId = p.ParentId
GROUP BY p.ParFirst, p.ParLast