鉴于此表结构,我想要展平多对多关系,并将一个表的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
答案 0 :(得分:3)
答案 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的软件包可能有所帮助。