【问题标题】:Specified Twice Table for 'DELETE' in MariaDB在 MariaDB 中为“DELETE”指定了两次表
【发布时间】:2019-09-23 16:31:39
【问题描述】:

我创建了一个查询来删除 MariaDB 中的一些记录

查询:

DELETE 
FROM
    HrAttLogsFormatted 
WHERE
    DateIn = '2019-04-10' 
    AND Late != '' 
    AND ( FingerId, CreatedDate ) IN (
    SELECT
        FingerId,
        MAX( CreatedDate ) 
    FROM
        HrAttLogsFormatted 
    WHERE
        DateIn = '2019-04-10' 
        AND Late != '' 
        AND FingerId IN ( SELECT FingerId FROM HrAttLogsFormatted WHERE DateIn = '2019-04-10' AND Late != '' GROUP BY FingerId HAVING COUNT( FingerId ) > 1 ) 
    GROUP BY
    FingerId 
)

结果:

表“HrAttLogsFormatted”被指定了两次,都作为 'DELETE' 并作为单独的数据源

但是我的查询不成功,有没有办法解决呢?

提前谢谢你

[EDIT-SOLVED] 只需应用和查询即可解决

DELETE t1
FROM HrAttLogsFormatted t1
INNER JOIN
(
    SELECT FingerId, MinCreatedDate
    FROM
    (
        SELECT FingerId, MIN(CreatedDate) AS MinCreatedDate
        FROM HrAttLogsFormatted 
        WHERE DateIn = '2019-05-03' AND Late != ''
        GROUP BY FingerId HAVING COUNT(FingerId) > 1
    ) x
) t2
    ON t1.FingerId = t2.FingerId AND t1.CreatedDate = t2.MinCreatedDate;

【问题讨论】:

  • 我现在可以给你一个解决方法,但我想请你清楚地告诉我们这里发生的逻辑。我的猜测是我们可以用更简单的方式重写您的查询。
  • 好的,提前谢谢你。在这种情况下,我有相同的 2 个数据,其中第一个数据是在开头创建的,第二个数据是在最后创建的……从这两个数据中,我想删除最后创建此数据的第二个数据@TimBiegeleisen

标签: sql wordpress mariadb sql-delete mariadb-10.4


【解决方案1】:

我会尝试将其写为删除连接:

DELETE t1
FROM HrAttLogsFormatted t1
INNER JOIN
(
    SELECT FingerId, MIN(CreatedDate) AS MinCreatedDate
    FROM HrAttLogsFormatted 
    WHERE DateIn = '2019-04-10' AND Late != ''
    GROUP BY FingerId
    HAVING COUNT(FingerId) > 1
) t2
    ON t1.FingerId = t2.FingerId AND t1.CreatedDate = t2.MinCreatedDate;

如果您真的想坚持当前的查询,您可以通过在 WHERE IN 子句周围添加一个额外的子查询来使其工作:

AND (FingerId, CreatedDate) IN (
    SELECT FingerId, MinCreatedDate
    FROM
    (
        SELECT FingerId, MIN(CreatedDate) AS MinCreatedDate
        FROM HrAttLogsFormatted
        ...
    ) x )

但是,我会使用我提供的版本,因为它更简单。

【讨论】:

  • 嗨,蒂姆,我试试你的 sql 版本,但查询有问题。请查看ibb.co/J3CDqbs
  • 哈哈哈,之前没看到CreateDate有错别字,我又试了一遍,结果还是一样
  • 请再试一次。
  • 结果还是一样,看来问题出在HAVING COUNT,对于MariaDb中的MariaDB1 itself in some articles I read HAVING COUNT` 格式:HAVING COUNT (* Field *)不支持HAVING (COUNT FingerId)
  • 是的,我尝试将HAVING (COUNT FingerId) 替换为HAVING COUNT (FingerId) 并且成功了。非常感谢@TimBiegeleisen 的解释并简化了查询
猜你喜欢
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
相关资源
最近更新 更多