2013-06-19 5 views
0

В этом сценарии есть четыре таблицы: TableA, TableB и TableC, внесенные и TableEПолучение несколько резюме

TableA -> TableB = 1-to-many 
TableB -> TableC = 1-to-many 
TableB -> TableD = 1-to-1 
TableC -> TableE = 1-to-1 

TableA { Id (PK), Field1 (float), DateField (DateTime) } 
TableB { Id (PK), TableAId (FK), TableDId (FK), Field2 (float) } 
TableC { Id (PK), TableBId (FK), TableEId (FK), Field3 (float) } 
TableD { Id (PK), Type (tinyint) } 
TableE { Id (PK), Type (tinyint) } 

Некоторые, но не все записи из TableB содержат ребенок записей в TableC. Основываясь на некоторых DateRange (от-до), мне нужно взять все записи из TableA, и связанных с ней записей и Calculate:

  • резюме TableA.Field1,
  • резюме TableB.Field2, сгруппированных по TableD.Type (существует 5 различных типов).
  • сводка TableC.Field3, объединенная с TableE.Type (существует 4 разных типа).

Таким образом, результат должен содержать 10 вычисленных сводок. Каким будет самый эффективный способ достичь этого?

Edit: вот псевдо запросы, как, например, для каждого резюме:

SELECT SUM(a.Field1) FROM TableA a INNER JOIN TableB b ON a.Id = b.TableAId WHERE a.DateField BETWEEN DateFrom AND DateTo 

SELECT SUM(b.Field2) FROM TableA a INNER JOIN TableB b ON a.Id = TableD d ON b.TableDId=d.Id WHERE a.DateField BETWEEN DateFrom AND DateTo AND d.Type = 1 

SELECT SUM(b.Field2) FROM TableA a INNER JOIN TableB b ON a.Id = TableD d ON b.TableDId=d.Id WHERE a.DateField BETWEEN DateFrom AND DateTo AND d.Type = 2 // etc to 5 

SELECT SUM(c.Field3) FROM TableA a INNER JOIN TableB b ON a.Id = b.TableAId INNER JOIN TableC c ON b.Id=c.TableBId INNER JOIN TableE ON c.TableEId=e.Id WHERE a.DateField BETWEEN DateFrom AND DateTo AND e.Type = 1 // 3x this query, only type is different 
+0

SUM aggregate или некоторые другие «резюме»? И любая группировка? – gbn

+0

Сгруппировка SUM, группировка требуется на Field2 и Field3, как уже упоминалось, обе группы относятся к каждому типу. – Goran

ответ

0

Я думаю, что лучший способ здесь, чтобы написать все это в одном запросе с КТР, и пусть оптимизатор фигуры в SQL Server из лучший способ выполнить эту вещь. Таким образом, мы не являемся:

  1. повторения работы с несколькими запросами
  2. создания таблицей переменных, которые не индексируются
  3. создания временных таблиц, которые должны быть записаны на диск

Вот запрос:

with a as (select * from tableA where datefield between datefrom and dateto), 
b as (select * from tableB where tableB.tableAid = a.id) 
    select null, sum(a.field1) from a 
union 
    select d.type, sum(b.field2) 
    from b 
    join tableD d on d.id = b.tableDid 
    group by d.type 
union 
    select e.type, sum(c.field3) 
    from tableC c 
    join b on b.id = c.tableBid 
    join tableE e on e.id = c.tableEid 
Смежные вопросы