HSQL视图错误:表达式不在聚合列或分组列中
我在hsql中有一个创建视图查询,但每当我运行它时,它都会抛出以下错误: 表达式不在聚合列或分组列中:AGV.ID 我知道如果没有任何聚合表达式AVG、SUM、MIN、MAX,GROUP BY将无法工作,但我不知道如何修复我的查询。。 因为每个记录都需要按manifestID值分组 基本上,我试图通过组合3组select查询来创建一个视图 我尝试使用distinct,但运气不佳,因为如果我选择了多个列,它将不起作用。 这个查询在MYSQL中运行良好 我的问题是:HSQL视图错误:表达式不在聚合列或分组列中,sql,view,hsqldb,Sql,View,Hsqldb,我在hsql中有一个创建视图查询,但每当我运行它时,它都会抛出以下错误: 表达式不在聚合列或分组列中:AGV.ID 我知道如果没有任何聚合表达式AVG、SUM、MIN、MAX,GROUP BY将无法工作,但我不知道如何修复我的查询。。 因为每个记录都需要按manifestID值分组 基本上,我试图通过组合3组select查询来创建一个视图 我尝试使用distinct,但运气不佳,因为如果我选择了多个列,它将不起作用。 这个查询在MYSQL中运行良好 我的问题是: CREATE VIEW loca
CREATE VIEW local_view_event_manifest(
manifest_id,
eventId,
eventType,
eventDate,
manifestID,
businessStepStr,
manifestVersion,
externalLocation,
remark,
epcCode,
locationCode
)
AS
SELECT
agm.manifest_id AS manifest_id,
agv.id AS eventId,
'AGGREGATION_EVENT' AS eventType,
agv.event_time AS eventDate,
md.manifest_id AS manifestID,
agv.business_step_code AS businessStepStr,
md.manifest_version AS manifestVersion,
md.external_location AS externalLocation,
md.remark AS remark,
epc.code as epcCode,
bloc.location_code as locationCode
FROM
"local".local_MANIFEST_DATA AS md,
"local".local_AGGREGATION_EVENT AS agv,
"local".local_AGGREGATION_EVENT_EPCS AS agv_epc,
"local".local_EPC AS epc,
"local".local_BUSINESS_LOCATION AS bloc,
"local".local_AGGREGATION_EVENT_MANIFEST_DATA AS agm
WHERE
md.id=agm.manifest_id
AND agv.deleted=0
AND md.deleted=0
AND agv.id=agm.aggregation_event_id
AND agv.id=agv_epc.aggregation_event_id
AND agv.business_location_id=bloc.id
AND bloc.id=agv.business_location_id
AND agv_epc.epc_id=epc.id
GROUP BY agm.manifest_id
UNION
SELECT
om.manifest_id AS manifest_id,
ov.id AS eventId,
'OBJECT_EVENT' AS eventType,
ov.event_time AS eventDate,
md.manifest_id AS manifestID,
ov.business_step_code AS businessStepStr,
md.manifest_version AS manifestVersion,
md.external_location AS externalLocation,
md.remark AS remark,
epc.code as epcCode,
bloc.location_code as locationCode
FROM
"local".local_MANIFEST_DATA AS md,
"local".local_OBJECT_EVENT AS ov,
"local".local_OBJECT_EVENT_EPCS AS ov_epc,
"local".local_EPC AS epc,
"local".local_BUSINESS_LOCATION AS bloc,
"local".local_OBJECT_EVENT_MANIFEST_DATA AS om
WHERE
md.id=om.manifest_id
AND ov.deleted=0
AND md.deleted=0
AND ov.id=ov_epc.object_event_id
AND ov.id=om.object_event_id
AND bloc.id=ov.business_location_id
AND ov_epc.epc_id=epc.id
GROUP BY om.manifest_id
UNION
SELECT
trm.manifest_id AS manifest_id,
trv.id AS eventId,
'TRANSACTION_EVENT' AS eventType,
trv.event_time AS eventDate,
md.manifest_id AS manifestID,
trv.business_step_code AS businessStepStr,
md.manifest_version AS manifestVersion,
md.external_location AS externalLocation,
md.remark AS remark,
epc.code as epcCode,
bloc.location_code as locationCode
FROM
"local".local_MANIFEST_DATA AS md,
"local".local_TRANSACTION_EVENT AS trv,
"local".local_TRANSACTION_EVENT_EPCS AS trv_epc,
"local".local_EPC AS epc,
"local".local_BUSINESS_LOCATION AS bloc,
"local".local_TRANSACTION_EVENT_MANIFEST_DATA AS trm
WHERE
md.id=trm.manifest_id
AND trv.deleted=0
AND md.deleted=0
AND trv.id=trv_epc.transaction_event_id
AND trv.id=trm.transaction_event_id
AND bloc.id=trv.business_location_id
AND trv_epc.epc_id=epc.id
GROUP BY trm.manifest_id
下面是mysql中使用GROUP BY和不使用GROUP BY查询结果的快照:
T
@弗雷德。。。
谢谢你的详细解释。。关于你的建议,我已经试过了。。但不知何故,我得到了这个错误:
错误:找不到表:语句[SELECT TABL_B.*FROM SELECT DISTINCT manifest_id FROM local.local_AGGREGATION_EVENT_manifest_DATA TABL_A]中的TABL_B错误代码:-22
以下是我的疑问:
SELECT TABL_B.* FROM (SELECT DISTINCT manifest_id FROM "local".local_AGGREGATION_EVENT_MANIFEST_DATA) TABL_A
LATERAL JOIN
( SELECT
agm.manifest_id AS manifest_id,
agv.id AS eventId,
'AGGREGATION_EVENT' AS eventType,
agv.event_time AS eventDate,
md.manifest_id AS manifestID,
agv.business_step_code AS businessStepStr,
md.manifest_version AS manifestVersion,
md.external_location AS externalLocation,
md.remark AS remark,
epc.code as epcCode,
bloc.location_code as locationCode
FROM
"local".local_MANIFEST_DATA AS md,
"local".local_AGGREGATION_EVENT AS agv,
"local".local_AGGREGATION_EVENT_EPCS AS agv_epc,
"local".local_EPC AS epc,
"local".local_BUSINESS_LOCATION AS bloc,
"local".local_AGGREGATION_EVENT_MANIFEST_DATA AS agm
WHERE
md.id=agm.manifest_id
AND agv.deleted=0
AND md.deleted=0
AND agv.id=agm.aggregation_event_id
AND agv.id=agv_epc.aggregation_event_id
AND agv.business_location_id=bloc.id
AND bloc.id=agv.business_location_id
AND agv_epc.epc_id=epc.id AND manifest_id = TABL_A.manifest_id LIMIT 1 ) TABL_B
谢谢@fredt。。我注意到逗号的问题,并且已经添加到我的查询中。我也试着去掉连接词。但还是犯了同样的错误
ERROR: Table not found in statement [SELECT TABL_B.* FROM (SELECT
DISTINCT MANIFEST_ID FROM "local".local_AGGREGATION_EVENT_MANIFEST_DATA)
AS TABL_A, LATERAL] Error Code: -22
对于HSQLDB 2.2.x或更高版本: 使用GROUP BY时,所有选定的列都必须位于GROUP BY列表中,聚合列除外。在您的示例中,GROUPBY列表应该包含11列,而不是一列 您可以使用DISTINCT,如在SELECT DISTINCT COL1、COLB、COLC。。。没有分组。DISTINCT是一种快捷方式,用于对选择列表中的所有列进行分组 通常,GROUP BY意味着查询应该只为GROUP BY列表中的每一列值组合返回一行。允许使用聚合,因为它们可以将多行中的值合并为一个值 现在,如果您包括GROUPBY列表中的所有列,并且结果中有多行具有相同的manifestID值,则意味着您不能仅根据manifestID进行分组 更新:您对MySQL的查询结果表明,这方面的要求不是很严格。manifestId=BHBHBH的行超过20行,其他列中的值不相同。但是MySQL会随机返回其中一行。根据其他数据库(包括HSQLDB)支持的SQL标准,GROUPBY不是这样工作的。请参见MySQL专家的博客: 如果需要类似于MySQL输出的内容,则需要如下查询:
SELECT TABL_B.* FROM (SELECT DISTINCT manifestID FROM "local".local_AGGREGATION_EVENT_MANIFEST_DATA) TABL_A,
LATERAL
( [YOUR SELECT STATEMENT WITHOUT GROUP BY] AND manifestID = TABL_A.manifestID LIMIT 1 ) TABL_B
首先尝试使用视图中的一个选择,然后应用于其余选择
您可以通过在限制1之前按列名称添加订单来选择返回哪一行。您可以发布一些具有预期结果的示例数据吗?hi Madhivan。。我已经添加了查询结果快照…我已经在顶部添加了我的预期结果快照:请参考此链接[通过分组查询结果]。感谢所有。。。很抱歉我没有及时回复。。我设法解决了它。。你们是对的。。我从hsql查询中删除了GROUPBY子句,并将select查询修改为具有DISTINCT属性