将子行连接起来,同时尊重或使用子句

时间:2018-05-10 13:42:04

标签: sql-server concatenation cross-apply

我有一个问题,我需要将子表的值连接到一个字段,同时还要遵守where子句中的OR条件。 让我们说我在Northwind数据库工作,我有一个查询,如:

SELECT c.CategoryName, p.ProductName FROM Products p join Categories c on p.CategoryID = c.CategoryID
where c.CategoryName like '%on%' or p.ProductName = 'Vegie-spread'
order by c.CategoryName, p.ProductName

我希望将所有产品名称连接到每个类别名称的一个字段中,以便Products字段看起来像这样:

Aniseed Syrup-Chef Anton's Cajun Seasoning-Chef Anton's Gumbo Mix-etc.

我的第一次尝试看起来像这样:

select c.CategoryName, ISNULL(products.line, '') AS ProductNames
    from Categories c
    cross apply (
        select CAST((select p.ProductName + '-'
        from products p
        where c.CategoryID = p.CategoryID
        and (c.CategoryName like '%on%' or p.ProductName = 'Vegie-spread')
        order by p.ProductName
        for xml path('')) as nvarchar(max)) line
    ) products
order by c.CategoryName

但是这会返回一些与where条件不匹配的类别。 我希望结果就像输入这个查询一样:

SELECT c.CategoryName, p.ProductName FROM Products p join Categories c on p.CategoryID = c.CategoryID
where c.CategoryName like '%on%' or p.ProductName = 'Vegie-spread'
order by c.CategoryName, p.ProductName

除了我想要每个类别一行,并且所有产品都与查询匹配。

有人可以告诉我该怎么做吗?

0 个答案:

没有答案