多个JOIN和GROUP BY:我的查询有什么问题?

时间:2013-12-19 15:42:26

标签: sql 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子句。

我错过了什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

Sam yi是对的。 group by必须是不属于聚合的所有列。有些引擎允许这样松散地从任何表中获取列的第一个实例,如果它不是聚合或组的一部分。由于您甚至没有任何聚合,因此您可以对每个聚合应用“max()”,如果值永远不会改变并且全面相同,则应该没有影响。

另外,让列名只是一个数字(我甚至不认为是允许的),IMO是一个非常糟糕的事情要处理,但相信这只是因为你隐藏了与你有关的REAL问题的实际内容遇到。

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