在TSQL中包含子表的数据结果表?

在TSQL中包含子表的数据结果表?,tsql,join,subset,sublist,Tsql,Join,Subset,Sublist,我正在处理一个产品页面,我必须一次查询所有数据,其中一列应该包含多个值。在本例中,它是一个包含多张图片的产品列表。不幸的是,我无法压缩同一列中的所有图片,以便稍后对其进行切片,因为数据将在XML.CONFIG页面中进行处理,该页面将为每个列处理数据。这就是我所拥有的 简而言之,我想知道是否有一种选择数据的方法,即每个记录都有一个“子列表” 例如 产品表: Id ProdId Desc 1 9003 Shirt 2 9004 Trouser 图片表: Id PicId

我正在处理一个产品页面,我必须一次查询所有数据,其中一列应该包含多个值。在本例中,它是一个包含多张图片的产品列表。不幸的是,我无法压缩同一列中的所有图片,以便稍后对其进行切片,因为数据将在XML.CONFIG页面中进行处理,该页面将为每个列处理数据。这就是我所拥有的

简而言之,我想知道是否有一种选择数据的方法,即每个记录都有一个“子列表”

例如

产品表:

Id  ProdId  Desc
1   9003    Shirt
2   9004    Trouser
图片表:

Id  PicId   ProdId
1   A       9003
2   B       9003
3   C       9004
4   D       9004
5   E       9003
查询结果:

ProdId  Desc    PicId
9003    Shirt   
                A
                B
                E
9004    Trouser 
                C
                D
我知道这听起来很疯狂,但我记得大约20年前,我在教堂管理的VB程序中使用SQL Server Express和Crystal Reports制作了类似的东西。我们有一份报告列出了会众成员的名单,并将他们的捐款分在每个成员下面。我确信我所做的一切都是为了运行一个SQL查询来完成这项工作,但那是很久以前的事了,我不记得是如何完成的

有什么想法吗

补充说明:

我只记得当我使用命令“SHAPE”时。我在T-SQL文档中找到了一个示例,但不知道为什么它不起作用。我的代码:

SHAPE {SELECT ProdId,Desc FROM product} AS PRO
APPEND ({SELECT PicId FROM pics} AS PIC
RELATE PRO.ProdId TO PIC.ProdId)
这很奇怪。我的操作与示例完全相同,但它说在}附近有一个sintax错误

T-SQL文档:
这是
prodid
上的一个简单的左连接

SELECT pr.prodid,
       pr.desc,
       pi.picid
       FROM product pr
            LEFT JOIN picture pi
                      ON pi.prodid = pr.prodid
       ORDER BY pr.prodid,
                pi.picid;
这会让你

普罗迪德 描述 左边 9003 衬衫 A. 9003 衬衫 B 9003 衬衫 E 9004 裤子 C 9004 裤子 D
如果您使用的是SQL 2017,则可以使用STRING_AGG函数。如果不是,我将使用FOR XML子句,例如:

CREATE TABLE #PRODUCT(Id int, ProdId int, [Desc] varchar(50))
INSERT INTO #PRODUCT VALUES
(1,9003,'Shirt'),
(2,9004,'Trouser')

CREATE TABLE #PICTURE(Id int,  PicId varchar(4),   ProdId int)
INSERT INTO #PICTURE VALUES
(1,'A', 9003),
(2,'B', 9003),
(3,'C', 9004),
(4,'D', 9004),
(5,'E', 9003)
对于SQL 2017及以上版本:

select p.id,p.ProdId, STRING_AGG(pt.PicID, CHAR(13)) PicID
from #PRODUCT p
INNER JOIN #PICTURE PT on p.ProdId = pt.ProdId 
GROUP BY p.Id,p.ProdId
SELECT p.id,p.ProdId,   
        STUFF(
             (SELECT  CHAR(13) +  pt.PicID 
              FROM #PICTURE pt
              WHERE p.ProdId = pt.ProdId
              FOR XML PATH ('')) 
             , 1, 1, '') PicID
    FROM #PRODUCT p
GROUP BY p.Id,p.ProdId
对于SQL 2016及以下版本:

select p.id,p.ProdId, STRING_AGG(pt.PicID, CHAR(13)) PicID
from #PRODUCT p
INNER JOIN #PICTURE PT on p.ProdId = pt.ProdId 
GROUP BY p.Id,p.ProdId
SELECT p.id,p.ProdId,   
        STUFF(
             (SELECT  CHAR(13) +  pt.PicID 
              FROM #PICTURE pt
              WHERE p.ProdId = pt.ProdId
              FOR XML PATH ('')) 
             , 1, 1, '') PicID
    FROM #PRODUCT p
GROUP BY p.Id,p.ProdId

这是表示层的任务,而不是RDBMS。”T-SQL文档:“这不是Transact-SQL文档;这是给阿多的。哎哟,是的,我完全错过了这个!:-(谢谢,我会尝试另一种方法:将其作为答案发布,这样我就可以接受它已解决。我相信它会为您带来一些分数。-)我还没有在这里发布答案,Yan。我知道如何执行连接,但这不是我想要的。您的查询生成了5条记录,应该只有2条(我认为我的示例在这个意义上非常清楚)。无论如何,我正在尝试TSQL文档中的SHAPE命令(我记得当时使用的是SHAPE命令),但由于某种原因,它不起作用。@YanKleber:您的示例结果有七行。。。是的,这个从5到7的转换,正如我所写的,由表示层来处理。不,它有两行,每行都有子集。对不起,如果我不能说得更清楚的话。也可以使用SHAPE命令在T-SQL中完成。我只是没有意识到为什么它不起作用。请参阅我在OP.@YanKleber中附加的注释:据我所知,SQL Server中没有行的列中的子集(Oracle知道嵌套表,但不知道SQL Server)。因此,对结果的唯一逻辑解释是七行,而不是两行。但好吧,我现在明白你的意思了,很难在这里表达出来。但我想你还是想在一些程序中展示这个结果,所以获取一个可能的关系结果并按照描述进行处理是一种方法。当然,没问题,谢谢。拉努解决了这个问题。再次感谢。