Sql server 干净的代码与一堆临时表

Sql server 干净的代码与一堆临时表,sql-server,Sql Server,一个查询通过剪切一些细节,将表B减少到更小的记录数,留下一个1->M TableA -- list of objects -------- Rec1 Rec2 Rec3 TableB -- list of TONS of details A->B = 1->MMM -------- Rec1, data..., String1 Rec1, data..., String1 Rec1, data..., String1 Rec1, data..., String2 Rec2, da

一个查询通过剪切一些细节,将表B减少到更小的记录数,留下一个1->M

TableA -- list of objects
--------
Rec1
Rec2
Rec3

TableB  -- list of TONS of details A->B = 1->MMM
--------
Rec1, data..., String1
Rec1, data..., String1
Rec1, data..., String1
Rec1, data..., String2
Rec2, data..., String1
Rec2, data..., String1
Rec3, data..., String1
Rec3, data..., String1
Rec3, data..., String2
Rec3, data..., String2
Rec3, data..., String3
试图建立

QueryResult
------------
Rec1, String1
Rec1, String2
Rec2, String1
Rec3, String1
Rec3, String2
Rec3, String3
我尝试为每个不同的字符串添加列,将字符串适当地打包,然后将各个字符串连接到摘要列中。虽然这样做有效,但它看起来很难看,让人想起我的工具箱里只有一把锤子

除了我的大锤外,还有更优雅的解决方案吗

如有评论和见解,将不胜感激。
谢谢

您可以使用
for xml
,将原始
表格a
加入到
查询结果中:

Final
---------
Rec1, String1 + String2
Rec2, String1
Rec3, String1 + String2 + String3
输出:

declare @TableA table(TableA nvarchar(10));
insert into @TableA values('Rec1'),('Rec2'),('Rec3');

declare @QueryResult table(TableA nvarchar(10),TableB nvarchar(10));
insert into @QueryResult values('Rec1','String1'),('Rec1','String2'),('Rec2','String1'),('Rec3','String1'),('Rec3','String2'),('Rec3','String3');


select TableA
        ,stuff((select ', ' + TableB  -- The ', ' is the delimiter.  The first instance of this is removed by the STUFF function.
                from @QueryResult t2
                where t1.TableA = t2.TableA
                order by t2.TableB
                for xml path('')
               )
              ,1,2,''                 -- This is where you specify how much from the start to remove.  
              ) as TableB
from @TableA t1;
stuff
函数从第一个参数值中指定的第n个字符(在本例中为
1
)开始,并用第三个参数值(在本例中为空字符串
'
)替换它和第二个参数位置(在本例中为字符
2
)中字符之前的所有内容


这意味着上述
for xml
语句的正常输出将是
、String1、String2
for
Rec1
,但在应用
填充后,前两个字符将替换为空字符串,因此
字符串
字符串、String2`结果。

您的问题不清楚。请更准确地说明你正在努力完成什么以及你已经完成了什么。谢谢你在今晚跳进来。我把它钉进了一个洞。你以秒数击败了我:-)+1伸出你的手指Shnugs@iamdave非常感谢。搜索以前的问题,发布这个,然后NN发现关于这个话题的长时间讨论。感谢您简短而甜蜜的解决方案。
+--------+---------------------------+
| TableA |          TableB           |
+--------+---------------------------+
| Rec1   | String1, String2          |
| Rec2   | String1                   |
| Rec3   | String1, String2, String3 |
+--------+---------------------------+