代码之家  ›  专栏  ›  技术社区  ›  CRice

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

  •  2
  • CRice  · 技术社区  · 16 年前

    给定这个表结构,我想将多对多关系展平,并将一个表的Name字段中的值转换为列标题,将同一个表中的数量转换为列值。目前的想法是将这些值放入一个字典(哈希表)并用代码表示这些数据,但我想知道是否有一种SQL方法可以做到这一点。我还使用linqtosql进行数据访问,因此linqtosql解决方案是理想的。

    [表A](int Id)

    [TableAB](int tableAId,int tableBId,int数量)

    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 回复  |  直到 15 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

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

    有关LINQ解决方案,请参阅 167304

        2
  •  2
  •   Andomar    16 年前

    下面是一个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不允许您创建具有动态列数的结果。

        3
  •  0
  •   VeeArr    16 年前

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