0


ほとんどの場合、適切な解決策をすでに見つけているため、これが最初の投稿です:)
しかし、今回は適切に役立つものは何もないようです。

読み取り専用アクセスしかない mysql データベースから情報を移行しようとしています。
私の問題はこれに似ています:
Group by では最新のグループが得られません
一部のテーブルから最新の情報を取得する必要もありますが、テーブルには 300k を超えるエントリがあるため、"time-attribute-value" がサブクエリと同じように(最初の回答で提案されているように)遅すぎます(「... WHERE EXISTS ...」を実行してサーバーがハングアップした後)。
それに加えて、単一の属性で重要な情報 (時間など) を見つけることはほとんどなく、単一の主キーはありません。
これまで、最新の「time-attribute-entry」といくつかの主キーを含むサブクエリと結合することで、2番目の回答で提案されていたように実行しましたが、結果で複数の結合と結合を使用した後、非常に混乱します。

したがって、次のような having ステートメントを使用することを

勧めし ます。多い = 39721、少ない = 37870)

SELECT COUNT(MATNR) AS MORE
    FROM(
    SELECT DISTINCT
        LAB_MTKNR AS MATNR,
        LAB_STG AS FACH,
        LAB_STGNR AS STUDIENGANG
    FROM
        FKT_LAB
    ) AS TEMP1


 SELECT COUNT(MATNR) AS LESS
    FROM(
    SELECT
        LAB_MTKNR AS MATNR,
        LAB_STG AS FACH,
        LAB_STGNR AS STUDIENGANG,
        LAB_PDATUM
    FROM
        FKT_LAB
    GROUP BY
        LAB_MTKNR,
        LAB_STG,
        LAB_STGNR
    HAVING LAB_PDATUM = MAX(LAB_PDATUM)
    )AS TEMP2

どちらも同じテーブルに適用され、同じエントリで「GROUP BY」/「SELECT DISTINCT」を使用しますが。
何か案は?
何も役に立たず、混乱に戻らなければならない場合は、文字列変数をプレースホルダーとして使用して整理しますが、1 つのクエリに含まれるサブクエリ、結合、およびユニオンの数の概要を失います... 一時テーブルはいくつになりますか?サーバーは対処できますか?

4

1 に答える 1

2

2 番目のクエリは、期待どおりの動作をしていません。これはクエリです:

SELECT COUNT(MATNR) AS LESS
FROM (SELECT LAB_MTKNR AS MATNR, LAB_STG AS FACH, LAB_STGNR AS STUDIENGANG, LAB_PDATUM
      FROM FKT_LAB
      GROUP BY LAB_MTKNR, LAB_STG, LAB_STGNR
      HAVING LAB_PDATUM = MAX(LAB_PDATUM)
    ) TEMP2;

問題はhaving節です。LAB_PDATUM集計されていない列 ( ) と集計された値 ( )が混在していますMAX(LAB_PDATAUM)。MySQL が行うことは、列の任意の値を選択し、それを最大値と比較することです。

多くの場合、任意の値は最大値ではないため、行がフィルター処理されます。あなたが与える参照は(受け入れられた答えですが)正しくありません。そこにコメントを入れました。

最新の値が必要な場合は、比較的簡単な方法を次に示します。

SELECT COUNT(MATNR) AS LESS
FROM (SELECT LAB_MTKNR AS MATNR, LAB_STG AS FACH, LAB_STGNR AS STUDIENGANG,
             max(LAB_PDATUM) as maxLAB_PDATUM
      FROM FKT_LAB
      GROUP BY LAB_MTKNR, LAB_STG, LAB_STGNR
    ) TEMP2;

ただし、外部カウントには影響しません。

于 2013-08-13T11:31:03.403 に答える