将多个子查询中的结果组合成一个逗号分隔值

我有两张桌子:

TableA ------ ID, Name TableB ------ ID, SomeColumn, TableA_ID (FK for TableA) 

这个关系是TableA一行 – 很多TableB

现在,我想看到这样的结果:

 ID Name SomeColumn 1. ABC X, Y, Z (these are three different rows) 2. MNO R, S 

这将无法正常工作(子查询中有多个结果):

 SELECT ID, Name, (SELECT SomeColumn FROM TableB WHERE F_ID=TableA.ID) FROM TableA 

这是一个微不足道的问题,如果我在客户端进行处理。 但这意味着我将不得不在每个页面上运行X查询,其中X是TableA的结果数。

请注意,我不能简单地做一个GROUP BY或类似的东西,因为它会为TableA行返回多个结果。

我不确定使用COALESCE或类似的东西的UDF是否可行?

即使这样也会达到目的

示例数据

 declare @t table(id int, name varchar(20),somecolumn varchar(MAX)) insert into @t select 1,'ABC','X' union all select 1,'ABC','Y' union all select 1,'ABC','Z' union all select 2,'MNO','R' union all select 2,'MNO','S' 

查询:

 SELECT ID,Name, STUFF((SELECT ',' + CAST(T2.SomeColumn AS VARCHAR(MAX)) FROM @T T2 WHERE T1.id = T2.id AND T1.name = T2.name FOR XML PATH('')),1,1,'') SOMECOLUMN FROM @T T1 GROUP BY id,Name 

输出:

 ID Name SomeColumn 1 ABC X,Y,Z 2 MNO R,S 

1.创buildUDF:

 CREATE FUNCTION CombineValues ( @FK_ID INT -- The foreign key from TableA which is used -- to fetch corresponding records ) RETURNS VARCHAR(8000) AS BEGIN DECLARE @SomeColumnList VARCHAR(8000); SELECT @SomeColumnList = COALESCE(@SomeColumnList + ', ', '') + CAST(SomeColumn AS varchar(20)) FROM TableB C WHERE C.FK_ID = @FK_ID; RETURN ( SELECT @SomeColumnList ) END 

2.在子查询中使用:

 SELECT ID, Name, dbo.CombineValues(FK_ID) FROM TableA 

我认为你与COALESCE走在了正确的轨道上。 请参阅这里查看以逗号分隔的string的示例:

http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string

在MySQL中有一个group_concat函数,将返回你所要求的。

 SELECT TableA.ID, TableA.Name, group_concat(TableB.SomeColumn) as SomColumnGroup FROM TableA LEFT JOIN TableB ON TableB.TableA_ID = TableA.ID 

您可能需要提供更多详细信息以获得更精确的回复。

由于你的数据集看起来很窄,你可以考虑在每个结果中使用一行,然后在客户端执行后期处理。

所以,如果你真的想让服务器做的工作返回一个结果集

 ID Name SomeColumn 1 ABC X 1 ABC Y 1 ABC Z 2 MNO R 2 MNO S 

这当然是一个简单的INNER JOIN ID

一旦将结果集返回到客户端,维护一个名为CurrentName的variables,并将其作为触发器停止将SomeColumn收集到您希望执行的有用事情中。

假设你只在表A上有WHERE子句,创build一个存储过程:

 SELECT Id, Name From tableA WHERE ... SELECT tableA.Id AS ParentId, Somecolumn FROM tableA INNER JOIN tableB on TableA.Id = TableB.F_Id WHERE ... 

然后用它填充一个DataSet ds。 然后

 ds.Relations.Add("foo", ds.Tables[0].Columns("Id"), ds.Tables[1].Columns("ParentId")); 

最后,您可以在页面中添加一个中继器,为每一行添加逗号

  <asp:DataList ID="Subcategories" DataKeyField="ParentCatId" DataSource='<%# Container.DataItem.CreateChildView("foo") %>' RepeatColumns="1" RepeatDirection="Horizontal" ItemStyle-HorizontalAlign="left" ItemStyle-VerticalAlign="top" runat="server" > 

这样你就可以做到客户端,但只有一个查询,在数据库和前端之间传递最less的数据

我试过解决priyanka.sarkar提到,并没有完全得到它的工作,因为OP问。 这是我最终解决的解决scheme:

 SELECT ID, SUBSTRING(( SELECT ',' + T2.SomeColumn FROM @T T2 WHERE WHERE T1.id = T2.id FOR XML PATH('')), 2, 1000000) FROM @T T1 GROUP BY ID 

解决scheme如下

 SELECT GROUP_CONCAT(field_attr_best_weekday_value)as RAVI FROM content_field_attr_best_weekday LEFT JOIN content_type_attraction on content_field_attr_best_weekday.nid = content_type_attraction.nid GROUP BY content_field_attr_best_weekday.nid 

使用这个,你也可以改变连接

 SELECT t.ID, t.NAME, (SELECT t1.SOMECOLUMN FROM TABLEB t1 WHERE t1.F_ID = T.TABLEA.ID) FROM TABLEA t; 

这将使用子查询从不同的表中select。

我已经回顾了所有的答案。 我想在数据库插入应该是这样的:

 ID Name SomeColumn 1. ABC ,X,YZ (these are three different rows) 2. MNO ,R,S 

逗号应该在前一个末尾,并按照%,X,%