HSQL视图错误:表达式不在聚合列或分组列中

HSQL视图错误:表达式不在聚合列或分组列中,sql,view,hsqldb,Sql,View,Hsqldb,我在hsql中有一个创建视图查询,但每当我运行它时,它都会抛出以下错误: 表达式不在聚合列或分组列中:AGV.ID 我知道如果没有任何聚合表达式AVG、SUM、MIN、MAX,GROUP BY将无法工作,但我不知道如何修复我的查询。。 因为每个记录都需要按manifestID值分组 基本上,我试图通过组合3组select查询来创建一个视图 我尝试使用distinct,但运气不佳,因为如果我选择了多个列,它将不起作用。 这个查询在MYSQL中运行良好 我的问题是: CREATE VIEW loca

我在hsql中有一个创建视图查询,但每当我运行它时,它都会抛出以下错误:

表达式不在聚合列或分组列中:AGV.ID

我知道如果没有任何聚合表达式AVG、SUM、MIN、MAX,GROUP BY将无法工作,但我不知道如何修复我的查询。。 因为每个记录都需要按manifestID值分组

基本上,我试图通过组合3组select查询来创建一个视图

我尝试使用distinct,但运气不佳,因为如果我选择了多个列,它将不起作用。 这个查询在MYSQL中运行良好

我的问题是:

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属性