将多个子查询中的结果组合成一个逗号分隔值
我有两张桌子:
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,%