2010-06-07 3 views
2

Учитывая эту структуру таблицы, я хочу сгладить отношения «многие-ко-многим» и внести значения в поле «Имя» одной таблицы в столбец заголовки и количества из одной таблицы в значения столбцов. Текущая идея, которая будет работать, состоит в том, чтобы поместить значения в словарь (хеш-таблицу) и представить эти данные в коде, но им интересно, есть ли способ SQL для этого. Я также использую Linq-to-SQL для доступа к данным, поэтому решение Linq-to-SQL было бы идеальным.Как запросить таблицу «многие-ко-многим» (значения одной таблицы становятся заголовками столбцов)

[TableA] (интермедиат Id)

[TableB] (интермедиат идентификатор, строка Name)

[TableAB] (интермедиат tableAId, внутр tableBId, внутр Количество)

Ф.К.: 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

Для решения TSQL используйте PIVOT.

Для решения LINQ см. 167304.

0

Этот вид операций не поддерживается концепциями реляционной базы данных. Использование программного пакета, который позволяет вам создать pivot table, может помочь.

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 позволяет создать результат с динамическим числом столбцов.