C# 联接SQL查询中一个字段的多个结果

C# 联接SQL查询中一个字段的多个结果,c#,sql-server,sql-server-2005,left-join,multiple-results,C#,Sql Server,Sql Server 2005,Left Join,Multiple Results,我不确定这是否可以通过SQL查询实现,但我会尝试一下 我正在用C#开发一个SharePoint web部件,它连接到SQL数据库并运行查询,然后将结果集数据绑定到gridview。它工作得很好,但我有一个小问题。在大多数情况下,我的查询只会为每个字段返回一个结果。我垂直显示信息,因此大致如下所示: Customer Name Mr. Customer Customer Address 980 Whatever St. Customer City

我不确定这是否可以通过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
fldMachineID
fldProductType
fldSteel
fldWood
fldPaper
一切都很好。但是,数据库中的一个表几乎总是返回多个结果。它列出了用于不同产品的不同类型的材料,因此模式是不同的,因为每个客户显然都有一个名称、一个地址、一个城市等,但他们都至少有一个产品,并且该产品至少有一个材料。如果我要单独显示这些信息,它将如下所示:

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
fldMachineID
fldProductType
fldSteel
fldWood
fldPaper
理想情况下,我认为最终结果如下:

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查询,但它非常庞大。我现在拉入了100多个字段,有很多子字符串格式和连接,所以这会浪费空间,但实际上这是一个相当简单的查询,我使用AS语句选择字段以获得我想要的名称,并使用一些左连接来拉入我需要的数据,而不需要进行多次查询。产品/材料表的架构如下所示:

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
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
输出:

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建议的内容在本文中进行了扩展:

您使用的是什么数据库,以及您希望如何返回这些值?我不确定我是否理解。目前,在我看来,您所需要做的就是添加一个左连接。但从你的问题来看,很明显你知道左连接,所以它不会那么简单。这让我回到“我不确定我是否理解”。也许添加预期的输出会让事情变得更清楚。我使用的是SQLServer2005。我编辑了原始问题,以更好地反映我期望的结果。现在我已经这样做了,我相信您可以看到,添加另一个左连接现在将提供多组结果(fldProductType中的每个结果一个),但是在datagrid的上下文中,我确实只需要一列数据类型名称和第二列结果。您为什么不进行多个查询?我看到3个选项:1)运行多个查询并使用数据关系将结果数据表连接在一起,2)使用左连接运行单个查询并处理客户端应用程序中的“额外”数据,3)将附加字段结果连接到结果的单个字段中。我不使用多个查询的唯一原因是尽可能简化C#。现在,我能够非常轻松地对datagrid进行数据绑定,并获得所需的结果;然而,如果最好的选择是多个查询,我愿意这样做,但不确定如何做。如果有一种方法可以在查询运行后简单地删除所有额外的结果,那么我也愿意这样做,即使我必须逐行构建datagrid(无论如何,我都想这样做,以便更好地控制CSS类定义)。你能举几个例子吗?谢谢。我不知道如何适应我的查询;我玩弄它,没能得到要求的结果。最后,我决定手动构建一个datatable,并将其加载到数据集中,以用于翻转数据集方向的方法。