[英]Multiple results for one field in a joined SQL query
我不确定是否可以通过SQL查询来实现这一点,但我会尝试一下。
我正在用C#开发一个SharePoint Web部件,该部件连接到SQL数据库并运行查询,然后将结果集数据绑定到gridview。 一切正常,但我有一个小障碍。 在大多数情况下,我的查询将为每个字段恰好返回一个结果。 我正在垂直显示信息,因此看起来大致像这样:
Customer Name Mr. Customer
Customer Address 980 Whatever St.
Customer City Tallahassee
一切都很好。 但是,数据库中的表之一几乎总是会返回多个结果。 它列出了用于不同产品的不同类型的物料,因此架构也有所不同,因为虽然每个客户显然拥有一个姓名,一个地址,一个城市等,但他们都将至少拥有一个产品,并且该产品将具有至少一种材料。 如果我要单独显示该信息,它将看起来像这样:
Product Steel Type Wood Type Paper Type
-----------------------------------------------------------------------------
Widget Thick Oak Bond
Whatsit Thin Birch
Thingamabob Oak Cardstock
理想情况下,我认为最终结果将是这样的:
Customer Name Mr. Customer
Customer Address 980 Whatever St.
Customer City Tallahassee
Widget Steel Thick
Widget Wood Oak
Widget Paper Bond
Whatsit Steel Thin
Whatsit Wood Birch
Thingamabob Wood Oak
Thingamabob Paper Cardstock
另一个可接受的结果可能是如下所示,添加了几列,但只为这些字段返回了多个结果:
Customer Name Mr. Customer
Customer Address 980 Whatever St.
Customer City Tallahassee
Product Steel Type Wood Type Paper Type
Widget Thick Oak Bond
Whatsit Thin Birch
Thingamabob Oak
我愿意接受任何建议。 如果可能的话,我想在没有单独查询的情况下将其包括在结果集中。 这是我用来提取数据的代码:
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
da.Fill(ds, "Specs");
DataSet flipped_ds = FlipDataSet(ds);
DataView dv = flipped_ds.Tables[0].DefaultView;
GridView outputGrid = new GridView();
outputGrid.ShowHeader = false;
outputGrid.DataSource = dv;
outputGrid.DataBind();
Controls.Add(outputGrid);
我会列出我的SQL查询,但这是巨大的。 我现在要输入一百多个字段,其中包含许多SUBSTRING格式和连接,所以这会浪费空间,但这实际上是一个相当简单的查询,我在其中使用AS语句选择字段以获取我想要的名称,并使用一些LEFT JOINs来获取我需要的数据而无需多次查询。 产品/物料表的架构如下所示:
fldMachineID
fldProductType
fldSteel
fldWood
fldPaper
因此很明显,每个客户都有很多条目,每个不同的fldProductType值一个。 如果我遗漏了任何内容,则可以添加。 感谢大家的时间和帮助!
尝试这个:
DECLARE @TableA table (RowID int, Value1 varchar(5), Value2 varchar(5))
DECLARE @TableB table (RowID int, TypeOf varchar(10))
INSERT INTO @TableA VALUES (1,'aaaaa','A')
INSERT INTO @TableA VALUES (2,'bbbbb','B')
INSERT INTO @TableA VALUES (3,'ccccc','C')
INSERT INTO @TableB VALUES (1,'wood')
INSERT INTO @TableB VALUES (2,'wood')
INSERT INTO @TableB VALUES (2,'steel')
INSERT INTO @TableB VALUES (2,'rock')
INSERT INTO @TableB VALUES (3,'plastic')
INSERT INTO @TableB VALUES (3,'paper')
;WITH Combined AS
(
SELECT
a.RowID,a.Value1,a.Value2,b.TypeOf
FROM @TableA a
LEFT OUTER JOIN @TableB b ON a.RowID=b.RowID
)
SELECT
a.*,dt.CombinedValue
FROM @TableA a
LEFT OUTER JOIN (SELECT
c1.RowID
,STUFF(
(SELECT
', ' + TypeOf
FROM Combined c2
WHERE c2.rowid=c1.rowid
ORDER BY c1.RowID, TypeOf
FOR XML PATH('')
)
,1,2, ''
) AS CombinedValue
FROM Combined c1
GROUP BY RowID
) dt ON a.RowID=dt.RowID
OUTPUT:
RowID Value1 Value2 CombinedValue
----------- ------ ------ ------------------
1 aaaaa A wood
2 bbbbb B rock, steel, wood
3 ccccc C paper, plastic
“翻转”数据集可以在sql中完成,例如,参见h @@ p://stackoverflow.com/questions/2344590/how-do-i-transform-rows-into-columns-in-sql-server-2005,但我同意,通常在C#中执行此操作通常更简单
KM建议的内容在本文中进行了扩展: http : //www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.