如果我像这样运行我的查询:
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 :(得分: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