Как можно объединить поле результата подзапроса в родительский запрос? - PullRequest
2 голосов
/ 19 июня 2009

БД: Sql Server 2008.

У меня действительно (фальшивый) отличный запрос: -

SELECT CarId, NumberPlate
    (SELECT Owner
     FROM Owners b
     WHERE b.CarId = a.CarId) AS Owners
FROM Cars a
ORDER BY NumberPlate

И это то, что я пытаюсь получить ...

=> 1    ABC123     John, Jill, Jane
=> 2    XYZ123     Fred
=> 3    SOHOT      Jon Skeet, ScottGu

Итак, я попытался использовать

AS [Text()] ... FOR XML PATH('') но это были странные закодированные символы (например, возврат каретки). ... так что я не на 100% доволен этим.

Я также пытался проверить, есть ли решение COALESCE, но все мои попытки потерпели неудачу.

Итак - есть предложения?

Ответы [ 3 ]

1 голос
/ 24 апреля 2019

Отвечая на старый пост, просто подумал, что нужно обновить для более новых версий SQL Server:

Для SQL Server 2017 используйте STRING_AGG ( выражение , разделитель )

GROUP_CONCAT - это MySQL.

До SQL 2017 вы также можете сделать что-то вроде (отрывается из нашей текущей базы кода на SQL Server 2016):

SELECT CarId, NumberPlate,
    (STUFF(( SELECT ', ' + b.Owner
        FROM Owners b
        WHERE b.CarId = a.CarId
        FOR XML PATH('')
        )
        ,1,2,'') AS Owners
FROM Cars a
ORDER BY NumberPlate

Ссылки на STRING_AGG https://database.guide/the-sql-server-equivalent-to-group_concat/ https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017

Ссылка на STUFF: https://docs.microsoft.com/en-us/sql/t-sql/functions/stuff-transact-sql?view=sql-server-2017

и, наконец, ссылки на FOR XML: https://docs.microsoft.com/en-us/sql/relational-databases/xml/for-xml-sql-server?view=sql-server-2017

1 голос
0 голосов
/ 23 марта 2019

Использование GROUP_CONCAT

SELECT CarId, NumberPlate
    (SELECT GROUP_CONCAT(Owner)
     FROM Owners b
     WHERE b.CarId = a.CarId) AS Owners
    FROM Cars a
ORDER BY NumberPlate
...