2016-03-04 65 views
-1

因此,我試着用Google搜索一個明確的答案,但沒有真正出現。簡單地說,這個問題是下面的是更好的(假設A是一個唯一的ID在T1):按風格分類的SQL Group

SELECT T1.A, SUM(T2.B), T1.C, T1.D, ... 
    FROM T1 
    JOIN T2 
     ON T1.A = T2.A 
GROUP BY T1.A, T1.C, T1.D, ... 

OR

SELECT T1.A, SUM(T2.B), MAX(T1.C) AS C, MAX(T1.D) AS D, ... 
    FROM T1 
    JOIN T2 
     ON T1.A = T2.A 
GROUP BY T1.A 

OR

SELECT DISTINCT T1.A, SUM(T2.B) OVER(PARTITION BY T1.A), T1.C, T1.D, ... 
    FROM T1 
    JOIN T2 
     ON T1.A = T2.A 

編輯:更好可讀性和性能條款。顯然,3號最有可能表現不佳。可讀性和可維護性是主要關心的問題。我個人比較喜歡第一個,但是在這裏工作的第二個人的工作量相當大,我想知道這兩者之間是否存在顯着差異。

+0

*更好*究竟是什麼?效率?可讀性?鍵入的字符數?你在使用什麼特定的RDBMS? –

+1

當然不是#3 – dnoeth

回答

1

許多問「哪個更好」的問題很可能是一個意見問題。對於你想要做的,第一個或第二個版本是好的:

SELECT T1.A, SUM(T2.B), T1.C, T1.D, ... 
FROM T1 JOIN 
    T2 
    ON T1.A = T2.A 
GROUP BY T1.A, T1.C, T1.D, ... 

爲什麼?

  • 作爲寫的,這是ANSI-SQL標準,應該在任何數據庫上運行。
  • 第二個版本(如最初編寫的)僅適用於MySQL,或者在某些情況下,Postgres(或其他支持group by子句中功能獨立列的ANSI概念的數據庫)。
  • 第二個版本現在好了。
  • 第三個版本對於普通人來說簡直是不可思議的。好吧,這是一個意見問題,我承認這一點。
  • 更重要的是,第三個版本隱藏了查詢的意圖,這是一個聚合。

前兩點是讓第一個版本「更好」的原因。

注:另一種版本將使用相關子查詢,並有可能在許多情況下更好的性能:

select t1.*, 
     (select sum(t2.b) from t2 where t2.A = t1.A) as b 
from t1; 

此版本僅相當於如果t1.A是獨一無二的。

+0

第二個版本(現在)在所有非分組字段上都具有集合函數,因此它應該可以在所有符合ANSI SQL的數據庫中工作。 –