0


这是我在这里的第一篇文章,因为大多数时候我已经找到了合适的解决方案:)
但是这一次似乎没有任何帮助。

我试图从一些我只有只读访问权限的 mysql 数据库中迁移信息。
我的问题类似于这个:
Group by 没有给我最新的组
我还需要从一些表中获取最新信息,但是我的表有 >300k 条目,因此检查“时间属性值”是否是与子查询中的相同(如第一个答案中建议的那样)会太慢(一旦我做了“... WHERE EXISTS ...”并且服务器挂断了)。
除此之外,我几乎无法在单个属性中找到重要信息(例如时间),而且从来没有一个主键。
到目前为止,我通过加入包含最新“时间属性条目”和一些主键的子查询来完成第二个答案中建议的操作,但是在使用多个连接和联合结果后,这让我陷入了巨大的混乱。

因此,我更喜欢使用像这里这样的语句:
Select entry with maximum value of column after grouping
但是当我尝试它并寻找一个好的候选人作为“时间属性”时,我注意到这个查询给了我两个不同的结果(更多 = 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”。
有任何想法吗?
如果没有任何帮助,我不得不回到我的混乱中,我将使用字符串变量作为占位符来整理它,但是我失去了在一个查询中我有多少子查询、连接和联合的概述......有多少临时表将服务器能应付吗?

4

1 回答 1

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 回答