2010-02-26 2 views
1

SQL 쿼리에서 가능한지 확실하지 않지만 한 번 사용해 보겠습니다.조인 된 SQL 쿼리에서 한 필드에 대해 여러 결과가 표시됨

SQL 데이터베이스에 연결하여 쿼리를 실행 한 다음 C#에서 SharePoint 웹 파트를 개발하고 그 결과를 gridview로 설정합니다. 괜찮 으면 좋겠지 만, 나는 작은 걸림 걸이가있다. 대부분의 경우, 쿼리는 모든 필드에 대해 정확히 하나의 결과를 반환합니다. 정보를 세로로 표시하고 있으므로 대략 다음과 같이 보입니다.

Customer Name   Mr. Customer 
Customer Address  980 Whatever St. 
Customer City   Tallahassee 

모든 것이 정상적으로 표시됩니다. 그러나 데이터베이스의 테이블 중 하나는 거의 항상 여러 결과를 반환합니다. 여기에는 여러 제품에 사용되는 여러 유형의 재료가 나열되어 있으므로 각 고객마다 분명히 하나의 이름, 주소, 도시 등이 있지만 각각 적어도 하나의 제품이 있고 그 제품에는 적어도 하나의 재료. 나는 그 자체로 정보를 표시한다면, 그것은 다음과 같이 보일 것입니다 : 다른 수용 가능한 결과 일 수

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 

:

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 
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 포맷과 연결을 많이 사용하여 100 개가 넘는 필드를 지금 당장 사용하고 있습니다. 따라서 공간 낭비가 될 것입니다. 그러나 실제로 AS 문으로 필드를 선택하면 매우 간단합니다. 원하는 이름을 사용하고 몇 개의 LEFT JOIN을 사용하여 몇 가지 쿼리없이 필요한 데이터를 가져옵니다.

fldMachineID 
fldProductType 
fldSteel 
fldWood 
fldPaper 

그래서 분명히, 각 고객이 항목의 수, 각 다른 fldProductType 값 하나를 가지고 : 제품/재료 테이블의 스키마는이 같은 것입니다. 내가 무엇이든 남겨두면 추가 할 수 있습니다. 모두의 시간과 도움에 감사드립니다!

+0

어떤 데이터베이스를 사용하고 있으며 그 값이 어떻게 반환 될 것으로 예상합니까? –

+0

나는 이해하고 있는지 잘 모르겠다. 그것이 그대로, 당신이해야 할 일은 LEFT JOIN을 추가하는 것입니다. 그러나 귀하의 질문에서 LEFT JOINS에 대해 알고있는 것은 명백합니다. 따라서 '단순'할 수는 없습니다. 그 말은 '이해할 수 있을지 모르겠다'라는 말로 되돌아 간다. 아마도 예상되는 결과를 추가하면 문제가 해결 될 것입니다. –

+0

SQL Server 2005를 사용하고 있습니다. 원하는 결과를 더 잘 반영 할 수 있도록 원래 질문을 편집했습니다. 지금까지 내가 한 결과, LEFT JOIN을 추가하면 fldProductType의 각 결과에 대해 하나씩 여러 세트의 결과를 얻을 수 있지만 DataGrid의 컨텍스트에서는 실제로 하나의 열만 있으면된다는 것을 알 수 있습니다. 데이터 유형 이름의 두 번째 열과 결과의 두 번째 열. –

답변

2

이 시도 :

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 
+0

이 쿼리를 내 쿼리에 적용하는 방법을 잘 모르겠습니다. 나는 그걸 가지고 놀았고 필요한 결과를 얻을 수 없었다. 필자는 수동으로 데이터 테이블을 작성하고 데이터 세트로로드하여 데이터 세트 방향을 바꿔주는 방법에 사용하도록 결정했습니다. –

관련 문제