子查询结果为一行

时间:2015-12-15 16:15:19

标签: sql sql-server

例如,我有两个这样的表:

Table Parent
+===========+==============+
| FirstName | (PK)LastName |
+===========+==============+
| Bob       | Newbie       |
| Bella     | Goth         |
+===========+==============+

Table Child
+===========+==============+
| FirstName | (FK)LastName |
+===========+==============+
| Cassandra | Goth         |
| Cindy     | Newbie       |
| Mortimer  | Goth         |
+===========+==============+

如何获得这样的SELECT结果:

+========+============+=====================+
| Family | ParentName | ChildName           |
+========+============+=====================+
| Goth   | Bella      | Cassandra, Mortimer |
| Newbie | Bob        | Cindy               |
+========+============+=====================+

到目前为止我尝试了什么

SELECT
    A.LastName Family,
    A.FirstName ParentName,
    (
        SELECT
            COALESCE(B.FirstName + ',' , '') + B.FirstName
        FROM
            Child B
        WHERE
            B.LastName = A.LastName
    ) ChildName
FROM
    Parent A
ORDER BY
    Family ASC

但是当我执行它时显示

  

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

任何想法?

2 个答案:

答案 0 :(得分:2)

这里的标准方法是使用一些XML技巧:

select *, STUFF((SELECT ',' + FirstName 
                 FROM child where LastName = p.LastName 
                 FOR XML PATH('')), 1, 1, '')
from parent p

答案 1 :(得分:1)

在这种情况下,您不需要使用子查询,只需要使用内部联接。 尝试使用类似的东西:

SELECT
    A.LastName Family,
    A.FirstName ParentName,
    COALESCE(B.FirstName + ',' , '') + B.FirstName    ChildName
FROM
    Parent A
    INNER JOIN Child B on A.LastName = B.LastName
ORDER BY
    A.Family ASC