如何查询多对多表(一个表的值成为列标题)

时间:2010-06-07 04:34:17

标签: sql linq-to-sql many-to-many pivot

鉴于此表结构,我想要展平多对多关系,并将一个表的Name字段中的值放入列标题中,将同一个表中的值放入列值中。当前的想法是将值放入Dictionary(哈希表)并在代码中表示这些数据,但我想知道是否有SQL方法来执行此操作。我也使用Linq-to-SQL进行数据访问,因此Linq-to-SQL解决方案将是理想的。

[TableA](int Id)

[TableB](int id,string Name)

[TableAB](int tableAId,int tableBId,int Quantity)

fk:TableA.Id加入TableAB.tableAId

fk:TableB.Id加入TableAB.tableBId

有没有办法可以查询这三个表并返回一个结果,例如:

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

3 个答案:

答案 0 :(得分:3)

对于TSQL解决方案,请使用PIVOT

对于LINQ解决方案,请参阅167304

答案 1 :(得分:2)

以下是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),
}

如果您事先不知道组的名称,请使用子查询:

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}

通过迭代生成一个新的数据集。我不认为Linq允许您使用动态列数创建结果。

答案 2 :(得分:0)

关系数据库背后的概念不支持这种操作。使用可以创建pivot table的软件包可能有所帮助。