对于一个场多导致加入SQL查询(Multiple results for one field in

2019-10-20 01:42发布

我不知道这是否可能从一个SQL查询,但我给它一个去。

我正在开发在连接到SQL数据库,并运行一个查询,那么该结果集到GridView databinds C#一个SharePoint Web部件。 它的工作很好,但我有一个小障碍。 在大多数情况下,我的查询将返回一结果的各个领域。 我垂直显示的信息,所以它看起来大致是这样的:

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 JOIN的在我,而不需要多个查询的数据中提取姓名。 产品/材料表的模式是这样的:

fldMachineID
fldProductType
fldSteel
fldWood
fldPaper

所以很明显,每个客户都有多个条目,每一个不同的fldProductType值。 如果我离开任何东西了,我可以添加它。 感谢大家的时间和帮助!

Answer 1:

尝试这个:

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


Answer 2:

“翻转”数据集可以在SQL中完成,例如详见H @@号码://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/



文章来源: Multiple results for one field in a joined SQL query