【问题标题】:Postgresql: deleting duplicate records by CompanyID and CustomerIDPostgresql:按 CompanyID 和 CustomerID 删除重复记录
【发布时间】:2019-06-22 20:38:47
【问题描述】:

我无法使用以下查询。如果我删除查询的最后一行,它将起作用。非常感谢任何建议。

DELETE FROM "ProjectMaster"
USING "ProjectMaster" ua2
WHERE "ProjectMaster"."EngagementName" = ua2."EngagementName" 
AND "ProjectMaster"."ProjectMasterID" < ua2."ProjectMasterID"
AND "CompanyID" = 490 and "ClientID" = 11125

【问题讨论】:

  • 请描述你想做什么。样本数据和期望的结果会有所帮助。
  • 错误信息是什么
  • @rich 我得到的错误是:错误:列引用“CompanyID”不明确
  • 嗯,是的,您已经为该列添加了别名,然后使用了两个都存在的 companyid 和 clientid(它是同一张表)。所以你需要指定你想从哪个表中获得 companyid 和 clientid。

标签: postgresql duplicates sql-delete


【解决方案1】:

当我在小提琴中运行您的查询时,它给了我:

错误:关系“ProjectMaster”不存在

在不改变逻辑(您实际上并没有解释)的情况下,可以进行一些更改以避免此错误:

  • 为您插入的表命名 (ua1)
  • 在最后一行的字段前面加上它们所属的表(ua1 或ua2?)
  • 摆脱这些嘈杂的报价

这运行没有语法错误:

DELETE FROM ProjectMaster ua1
USING ProjectMaster ua2
WHERE 
    ua1.EngagementName = ua2.EngagementName
    AND ua1.ClientID = ua2.ClientID
    AND ua1.ProjectMasterID < ua2.ProjectMasterID
    AND ua1.CompanyID = 490 and ua1.ClientID = 11125;

【讨论】:

  • 您将无法在小提琴中运行。我使用的工具是 Navicat,数据库是 Postgres,需要引号。
  • @Tim:是的,我明白了。尽管我没有在答案中粘贴链接,但我确实在 Postgres 小提琴中进行了测试。如果您只是在我的查询中添加引号并运行它,它会按预期工作吗?
  • 澄清一下。我正在尝试按 CompanyID 和 ClientID 过滤记录,但在 ProjectMaster 表中找到具有重复 EngagementNames 的重复项。所以 ProjectMaster 中的每一行都有 CompanyID、ClientID、EngagementName。 ——
  • 您的查询运行没有错误,但它会从 ProjectMaster 表中删除所有记录。它应该只删除重复项。 6 条记录:1040 税务准备、1040 税务准备、咨询、咨询、其他、其他。当然,这些行中的每一行也有 CompanyID 490 和 ClientID 11125。这个 ClientID-11125 应该只留下 3 条记录。您的查询删除了所有 6 条记录。
  • 感谢您通知我@GMB。我是新来的。接受 - 完成。我在这里找到了很多答案,但从未提出过问题。再次感谢!
【解决方案2】:

我在想这样的事情:

DELETE FROM "ProjectMaster"
WHERE "CompanyID" = 490 and "ClientID" = 11125 AND
      "ProjectMasterID" < (SELECT MAX(pm2."ProjectMasterID" 
                           FROM "ProjectMaster" pm2
                           WHERE pm2."CompanyID" = "ProjectMaster"."CompanyID" AND
                                 pm2."ClientID" = "ProjectMaster"."ClientID"
                          );

也就是说,相关性在于公司和客户,而不是所谓的参与度。这是基于我对您问题标题的解释。

【讨论】:

  • 目的:查找CompanyID = 490和ClientID 11125的所有重复记录,如果查询找到10条记录,5条好,5条重复,则删除5条重复记录。我想选择为整个公司或特定客户运行查询。这是一个包含许多公司的多租户数据库,因此我必须按公司限制记录。感谢您的快速回复!
  • 澄清一下。我正在尝试按 CompanyID 和 ClientID 过滤记录,但在 ProjectMaster 表中找到具有重复 EngagementNames 的重复项。所以 ProjectMaster 中的每一行都有 CompanyID、ClientID、EngagementName。
猜你喜欢
  • 1970-01-01
  • 2021-03-17
  • 2021-12-16
  • 2016-01-07
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多