2010-11-11 2 views
0

Допустим, у меня есть следующие таблицы отношений (с помощью ключей, существующих на обоих концах)SQL сумма() с несколькими уровня присоединяется

table a -> table b 
table b -> table c 
table c -> table d 
table d -> table e 
table e -> table f 

И я хочу, чтобы группа по ключу на table a и суммы() значения из table f, как если бы обе таблицы были непосредственно соединены.

Проблема заключается в том, что если я сделаю это, информация будет дублироваться, так как все отношения из a -> b -> c -> d -> e -> f будут повторяться (как сказал Андомар: некоторая информация повторяется, поскольку существует несколько маршруты от А до F)

Есть ли способ обойти это, или это мой единственный выбор, чтобы создать среднюю таблицу, содержащую отношения table a ->table f?

Детали:

Table a 
id1 | id2 

Table b 
id2 | id3 

Table c 
id3 | value 

select a.id1, sum(value) from a 
inner join b on a.id2 = b.id2 
inner join c on b.id3 = c.id3 
group by a.id1 

Пример данных:

Doing объединения, отношения:

a b c value 
1 2 2 20 
1 3 2 20 
1 4 2 20 

Если я сумма(), я получу 60, но я хочу для получения 20

С благодарностью

+0

Я думаю, нам понадобится дополнительная информация о структурах таблиц и ключах –

+0

Редактировать: Я добавил деталь в вопрос. Вопрос не требует особого уровня детализации, вопрос относится ко всем наборам таблиц. Просто предположим, что таблица a связана с таблицей b через некоторый столбец, таблица b связана с таблицей c через другой столбец и т. Д. –

+0

Что значит «информация будет дублироваться»? Какая информация? Если вы делаете внутренние соединения по пути, вы должны получить одну копию каждой общей строки между двумя таблицами. – BeemerGuy

ответ

1

Я предполагаю, что некоторая информация повторяется, потому что есть несколько маршрутов от А до F. Если есть уникальный ключ в F, вы можете отменить дублирование маршрутов с использованием подзапроса:

SELECT SubQuery.AValue, sum(SubQuery.FValue) 
FROM (
     SELECT a.value as AValue, f.key, f.value as FValue 
     FROM a 
     INNER JOIN b ON b.key = a.key 
     INNER JOIN c ON c.key = b.key 
     INNER JOIN d ON d.key = c.key 
     INNER JOIN e ON e.key = d.key 
     INNER JOIN f ON f.key = e.key 
     GROUP BY a.value, f.key, f.value 
     ) as SubQuery 
GROUP BY SubQuery.AValue 

подзапросом гарантирует каждая строка в F подсчитывается только один раз.

+0

Привет Андомар, большое спасибо. Поэтому SQL не имеет специального синтаксиса, чтобы сказать, что мне нужны уникальные маршруты между A и F на языке –

Смежные вопросы