Как запросить таблицу «многие ко многим» (значения одной таблицы становятся заголовками столбцов) - PullRequest
2 голосов
/ 07 июня 2010

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

[Таблица A] (int Id)

[Таблица B] (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 ]

3 голосов
/ 07 июня 2010

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

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

2 голосов
/ 07 июня 2010

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

0 голосов
/ 07 июня 2010

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

...