2013-12-19 40 views
-1

如果我跑我的查詢是這樣的:多個JOIN和GROUP BY:我的查詢有什麼問題?

select 
    Sys.1,Sys.2,Sys.3, 
    DDD.a,DDD.b,DDD.c, 
    Gen.x,Gen.y,Gen.z 
from sys_table Sys 
join ddd_table DDD on (Sys.3=DDD.a) 
join gen_table Gen on (DDD.a=Gen.x) 
where 
    Sys.1 = 'string' 
    AND Sys.2 = 1 
    AND Sys.3 = 1 
GROUP BY a 

我得到一個錯誤「不明確的列名‘A’。

如果我指定喜歡這裏的表:

select 
    Sys.1,Sys.2,Sys.3, 
    DDD.a,DDD.b,DDD.c, 
    Gen.x,Gen.y,Gen.z 
from sys_table Sys 
join ddd_table DDD on (Sys.3=DDD.a) 
join gen_table Gen on (DDD.a=Gen.x) 
where 
    Sys.1 = 'string' 
    AND Sys.2 = 1 
    AND Sys.3 = 1 
GROUP BY DDD.a 

我得到的錯誤:列「sys_table.1」在選擇列表中無效,因爲它不包含聚合函數或GROUP BY子句。

我錯過了什麼?

+0

您修復了一個語法錯誤,並發現另一個被第一個隱藏。正如你的錯誤信息所說,如果你'SELECT a,b,c'那麼你不能只是'GROUP BY a',你需要'GROUP BY a,b,c'或'SELECT a,SUM(b) ,SUM(c)'。你能舉例輸入和輸出數據,足以證明你想要完成的行爲嗎? – MatBailie

+0

如果沒有組,我會收到6行,其中包含2個不同的數據。所以例如2行相同的數據,4行相同的數據。我想要兩行,每行一行,這意味着我需要1行/'DDD.a'值。明白了嗎? – fishmong3r

+0

請。顯示。一些。例。數據。輸入和輸出? – MatBailie

回答

1

山姆義是正確的。 group by必須是所有不屬於聚合的列。有些引擎允許這樣鬆散地從任何表中獲取列的第一個實例,如果它不是聚合或組的一部分。既然你甚至沒有任何聚集,你可以對每一個應用一個「max()」,並且如果這些值永遠不會改變,並且在整個板上都是一樣的,那麼不應該有任何影響。

此外,列名只是一個數字(我甚至認爲是不允許的),是國際海事組織一個非常糟糕的事情來處理,但相信這只是因爲你隱藏實際內容相對於真正的問題你正在遭遇。

select 
     DDD.a, 
     max(Sys.1) as `1`, 
     max(Sys.2) as `2`, 
     max(Sys.3) as `3`, 
     max(DDD.b) as b, 
     max(DDD.c) as c, 
     max(Gen.x) as x, 
     max(Gen.y) as y, 
     max(Gen.z) as z 
    from 
     sys_table Sys 
     join ddd_table DDD on (Sys.3 = DDD.a) 
      join gen_table Gen on (DDD.a = Gen.x) 
    where 
      Sys.1 = 'string' 
     AND Sys.2 = 1 
     AND Sys.3 = 1 
    GROUP BY 
     DDD.a 
+0

當然,我並沒有使用數字作爲列名,這只是一個例子 – fishmong3r

1

出現第一個錯誤可能是因爲字段名稱「a」存在於多個表中。在第二個查詢中,您需要將所有選擇的字段組合在一起(實際上,根本不需要組合,因爲沒有使用聚合函數,所以將所有字段組合在一起沒有任何意義)。 因此,你的選擇將是:

select 
Sys.1,Sys.2,Sys.3,DDD.a,DDD.b,DDD.c,Gen.x,Gen.y,Gen.z 
from 
sys_table Sys 
join ddd_table DDD on (Sys.3=DDD.a) 
join gen_table Gen on (DDD.a=Gen.x) 
where 
Sys.1 = 'string' AND Sys.2 = 1 AND Sys.3 = 1 
+0

沒有任何聚合函數的分組並不完全沒有意義......它消除了重複項。您可以刪除「GROUP BY」,但必須添加「DISTINCT」以保持相同的含義。 –

+0

我已經嘗試使用獨特的DDD.a,但我得到語法錯誤:'SELECT Sys.1,Sys.2,Sys.3,DISTINCT(DDD.a),DDD.b ...'等 – fishmong3r