2013-06-19 29 views
0

在這種情況下有四個表:表A,表B和表C,表D和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) } 

一些,但不能從表B中的所有記錄包含表C兒童的記錄。基於一些日期範圍(從到),我需要的所有記錄從表A,它的相關記錄,並計算:TableA.Field1的

  • 總結,TableB.Field2的
  • 總之,通過分組TableD.Type(有5種不同的類型)。
  • TableC.Field3的摘要,被TableE.Type(有4種不同的類型)所困擾。

所以,結果應該包含10個計算的摘要。什麼是最有效的方法來實現這一目標?

編輯:這裏是僞查詢,例如,對於每個彙總:

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聚合或其他「摘要」?和任何分組? – gbn

+0

SUM聚合,Field2和Field3需要分組,如前所述,兩個分組都是每個類型。 – Goran

回答

0

我覺得這裏最好的辦法是寫在一個查詢與CTE的整個事情,並讓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