0

hsql に CREATE VIEW クエリがありますが、実行するたびに次のエラーがスローされます。

集計列または GROUP BY 列にない式: AGV.ID

集計式 (AVG、SUM、MIN、MAX) がないと GROUP BY が機能しないことは理解していますが、クエリを修正する方法がわかりません。各レコードを manifestID 値でグループ化する必要があるためです。

基本的に、3セットの選択クエリを組み合わせてVIEWを作成しようとしています。

複数の選択した列があると機能しないため、個別を使用しようとしましたが、うまくいきませんでした。このクエリは 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

以下は、GROUP BY を使用した場合と GROUP BY を使用しない場合の mysql でのクエリ結果のスナップショットです。

GROUP BY を使用したクエリ結果

GROUP BY なしのクエリ結果

T


@fredt ...詳細な説明をありがとう..あなたの提案を参照して、私はそれを試しました..しかし、どういうわけかこのエラーが発生します:

エラー: テーブルが見つかりません: ステートメントの TABL_B [SELECT TABL_B.* FROM (SELECT DISTINCT manifest_id FROM "local".local_AGGREGATION_EVENT_MANIFEST_DATA) TABL_A] エラー コード: -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 ..コンマに気づき、すでにクエリに追加されています。JOIN単語も削除してみました。しかし、それでも同じエラーがスローされます..

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
4

1 に答える 1

2

HSQLDB 2.2.x 以降の場合:

GROUP BY を使用する場合、集計である列を除いて、選択したすべての列が GROUP BY リストにある必要があります。あなたの例では、GROUP BY リストには 1 列ではなく 11 列を含める必要があります。

SELECT DISTINCT COL1, COLB, COLC, ...group byを使用しない場合と同様に、DISTINCT を使用できます。DISTINCT は、SELECT リスト内のすべての列をグループ化するためのショートカットです。

一般に、GROUP BY は、クエリが GROUP BY リスト内の列値の組み合わせごとに 1 つの行のみを返す必要があることを意味します。複数の行の値を 1 つの値に結合するため、集計が許可されます。

GROUP BY リストにすべての列を含め、結果に同じ manifestID 値を持つ複数の行がある場合、manifestID だけで実際にグループ化できないことを意味します。

更新: MySQL でのクエリ結果は、この領域がそれほど厳密ではないことを示しています。manifestId=bhbhbhbh の行が 20 行以上あり、他の列の値は同じではありません。しかし、MySQL は行の 1 つをランダムに返します。これは、HSQLDB を含む他のデータベースでサポートされている SQL 標準に従って GROUP BY が機能する方法ではありません。MySQL の専門家によるこのブログを参照してください。

http://www.mysqlperformanceblog.com/2006/09/06/wrong-group-by-makes-your-queries-fragile/

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

最初に VIEW 内の選択の 1 つを試してから、残りに適用します。

LIMIT 1 の前に ORDER BY COL_NAME を追加することで、返される行を選択できます。

于 2012-07-24T11:24:25.193 に答える