2013-12-19 41 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