2010-06-07 10 views
2

Étant donné cette structure de table, je souhaite aplatir les relations plusieurs-à-plusieurs et placer les valeurs dans le champ Nom d'une table dans colonne en-têtes et les quantités de la même table dans les valeurs de colonne. L'idée actuelle qui va fonctionner est de mettre les valeurs dans un dictionnaire (hashtable) et de représenter ces données dans le code, mais je me demande s'il y a une façon SQL de le faire. J'utilise également Linq-to-SQL pour l'accès aux données, donc une solution Linq-to-SQL serait idéale.Comment faire des requêtes Table plusieurs-à-plusieurs (les valeurs d'une table deviennent des en-têtes de colonne)

[TableA] (int Id)

[TableB] (id int, string Nom)

[TableAB] (int tableAId, int tableBId, int Quantité)

fk: TableA. Id joint à TableAB.tableAId

fk: TableB.Id joint à TableAB.tableBId

Est-il possible que je peux interroger les trois tables et retourner un résultat par exemple:

TableA 
[Id] 
1 

TableB 
[Id], [Name] 
1, "Red" 
2, "Green" 
3, "Blue" 

TableAB 
[TableAId], [TableBId], [Quantity] 
1   1   5 
1   2   6 
1   3   7 

Query Result: 
[TableA.Id], [Red], [Green], [Blue] 
1,   5,  6,  7 

Répondre

3

Pour une solution TSQL, utilisez PIVOT.

Pour une solution LINQ, voir 167304.

0

Ce type d'opération n'est pas pris en charge par les concepts de la base de données relationnelle. L'utilisation d'un logiciel qui vous permet de créer un pivot table peut vous aider.

2

Voici un exemple requête LINQ:

from rows in (
    from a in TableAs 
    join ab in TableABs on a.Id equals ab.TableAId 
    join b in TableBs on ab.TableBId equals b.Id 
    select new {a.Id, b.Name, ab.Quantity} 
) 
group rows by new {rows.Id} into g 
select new { 
    AId = g.Key.Id, 
    Red = g.Sum(x => x.Name == "Red" ? x.Quantity : 0), 
    Green = g.Sum(x => x.Name == "Green" ? x.Quantity : 0), 
    Blue = g.Sum(x => x.Name == "Blue" ? x.Quantity : 0), 
} 

Si vous ne connaissez pas les noms des groupes à l'avance, utilisez la sous-requête:

from a in TableAs 
join ab in TableABs on a.Id equals ab.TableAId 
join b in TableBs on ab.TableBId equals b.Id 
select new {a.Id, b.Name, ab.Quantity} 

Et générer un nouveau jeu de données par itérer sur cette . Je ne pense pas que Linq vous permette de créer un résultat avec un nombre de colonnes dynamique.