2010-02-26 6 views
1

Je ne sais pas si cela est possible avec une requête SQL, mais je vais essayer.Plusieurs résultats pour un champ dans une requête SQL jointe

Je suis en train de développer un composant Web SharePoint en C# qui se connecte à une base de données SQL et exécute une requête, puis des liens de données dont le résultat est défini sur une grille. Ça fonctionne bien, mais j'ai un petit problème. Pour l'essentiel, ma requête retournera exactement un résultat pour chaque champ. J'affiche l'information verticalement, donc il ressemble à peu près à ceci:

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

Tout s'affiche très bien. Cependant, l'une des tables de la base de données renvoie à peu près toujours plusieurs résultats. Il répertorie différents types de matériaux utilisés pour différents produits, de sorte que le schéma est différent parce que chaque client aura évidemment un nom, une adresse, une ville, etc., ils auront tous au moins un produit, et ce produit aura à au moins un matériau. Si je devais afficher ces informations sur lui-même, il ressemblerait à quelque chose comme ceci:

Product    Steel Type    Wood Type    Paper Type 
----------------------------------------------------------------------------- 
Widget    Thick     Oak     Bond 
Whatsit    Thin     Birch 
Thingamabob         Oak     Cardstock 

Idéalement, je suppose que le résultat final serait quelque chose comme:

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 

Un autre résultat acceptable pourrait être quelque chose comme ce qui suit, en ajoutant quelques colonnes, mais seulement de retourner des résultats pour ces champs:

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        

Je suis ouvert à toute suggestion. Je voudrais inclure ceci dans le jeu de résultats sans une requête séparée, si c'est possible. Voici le code que j'utilise pour extraire les données:

    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); 

Je listerais ma requête SQL, mais c'est énorme. J'utilise actuellement plus d'une centaine de champs, avec beaucoup de formatage et de concaténation de SUBSTRING, donc ce serait un gaspillage d'espace, mais c'est vraiment une requête assez simple où je sélectionne des champs avec l'instruction AS pour obtenir le noms que je veux, et en utilisant quelques JOINs LEFT pour tirer dans les données dont j'ai besoin sans plusieurs requêtes. Le schéma du produit/la table des matières est quelque chose comme ceci:

fldMachineID 
fldProductType 
fldSteel 
fldWood 
fldPaper 

Alors évidemment, chaque client a un certain nombre d'entrées, une pour chaque valeur différente de fldProductType. Si je laisse quelque chose, je peux l'ajouter. Merci pour le temps et l'aide de tout le monde!

+0

Quelle base de données utilisez-vous et comment attendez-vous que ces valeurs soient renvoyées? –

+0

Je ne suis pas sûr de comprendre. En l'état, il me semble que tout ce que vous avez à faire est d'ajouter un LEFT JOIN. Mais d'après votre question, il est évident que vous connaissez LEFT JOINS, donc cela ne peut pas être aussi simple. Cela me ramène à 'je ne suis pas sûr de comprendre'. Peut-être que l'ajout de la production attendue éclaircirait les choses. –

+0

J'utilise SQL Server 2005. J'ai modifié la question initiale pour mieux refléter mes résultats souhaités. Maintenant que je l'ai fait, je suis sûr que vous pouvez voir que l'ajout d'un autre LEFT JOIN va maintenant me donner plusieurs ensembles de résultats (un pour chaque résultat dans fldProductType) mais dans le contexte de la grille de données, j'ai vraiment besoin d'une seule colonne des noms de types de données et une deuxième colonne de résultats. –

Répondre

2

essayez ceci:

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 

SORTIE:

RowID  Value1 Value2 CombinedValue 
----------- ------ ------ ------------------ 
1   aaaaa A  wood 
2   bbbbb B  rock, steel, wood 
3   ccccc C  paper, plastic 
+0

Je ne sais pas comment l'adapter à ma requête; J'ai joué avec et je n'ai pas pu obtenir les résultats requis. J'ai fini par décider de construire manuellement une datatable et de la charger dans un ensemble de données à utiliser dans la méthode que j'ai pour retourner l'orientation du jeu de données. –

Questions connexes