【问题标题】:Can I delete rows/replace table based on temp table我可以根据临时表删除行/替换表吗
【发布时间】:2020-07-20 17:31:03
【问题描述】:

这段代码给了我一个唯一值的表(没有重复):

SELECT id, firstname, lastname, startdate, position
FROM  (
   SELECT id, firstname, lastname, startdate, position,
     ROW_NUMBER() OVER (PARTITION BY (firstname, lastname) ORDER BY startdate DESC) rn
   FROM people
   ) tmp
WHERE rn = 1;

什么语法会用这个表的结果替换当前表?

或者,我可以使用WHERE rn <> 1 来获取我想要删除的所有数据,但是我再次努力使用这种方法来获取DELETE 的语法。

【问题讨论】:

  • 我认为这个问题需要更多的思考和信息。我在示例中没有看到 DELETE。此外,您似乎想做一个INSERT UPDATE("什么语法会用这个结果替换当前表?") 当前表是什么?
  • 如果您忽略“缓慢”问题,这是对问题和答案中几个不同选项的很好讨论:stackoverflow.com/questions/47402098/…

标签: postgresql duplicates sql-delete temp-tables row-number


【解决方案1】:

假设firstnamelastnamestartdate 中的值永远不是NULL,这个带有NOT EXISTS 反半连接的简单查询就可以完成这项工作:

DELETE FROM people AS p
WHERE  EXISTS (
   SELECT FROM people AS p1
   WHERE  p1.firstname = p.firstname
   AND    p1.lastname  = p.lastname
   AND    p1.startdate > p.startdate
   );

它删除存在较新副本的每一行,有效地保留每组对等点的最新行。 (当然,(firstname, lastname) 是一种糟糕的身份建立方式。有很多不同的人同名。演示可能会简化......)

startdate 中可以有相同的值吗?那么你需要一个决胜局...

通常比使用带有row_number() 的子查询更快。有一百零一种方法可以加快速度,具体取决于您的具体情况和要求。见:

如果比较的列可以是NULL,请考虑:

有一个完整的专用标签。将其与 结合使用以缩小范围:

【讨论】:

  • 您的方法看起来比我尝试做的要简单得多。示例代码不是我的确切情况。对于每行重复的行,我都有一个 serial_no。比较的日期没有空值,但可以有联系。你能详细说明我如何加入决胜局吗?
  • @tuskity:请相应地澄清问题。告诉我们会发生什么关系以及你希望如何打破关系,然后我可以告诉你如何实现它。您也可以为此提出一个新问题,并提供详细信息。
  • 我在这里为该主题设置了一个新问题:stackoverflow.com/questions/63005307/…
猜你喜欢
  • 2012-04-06
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 2022-01-23
  • 2018-11-09
  • 1970-01-01
  • 2023-03-23
  • 2013-07-22
相关资源
最近更新 更多