【问题标题】:Is there a way to SELECT the TOP N rows from a table and delete them afterwards?有没有办法从表中选择前 N 行并在之后删除它们?
【发布时间】:2025-12-31 19:35:01
【问题描述】:

我想在 Teradata 中实现以下目标。

给定一张桌子,我想

  • 从表中获取前 N 行,例如,SELECT TOP 100 * FROM table ORDER BY idx
  • 之后删除这些行,例如DELETE FROM table WHERE idx IN (SELECT TOP 100 idx FROM table ORDER BY idx)

第二个查询甚至不起作用(子查询中不允许 TOP)。

是否有直接的方法来实现这种行为?理想情况下,即使是匆忙,但我也可以使用锁。

我也查看了队列表,但它们只允许 TOP 1,因此显然设计为一次只弹出一个元素。

【问题讨论】:

  • 不知道teradata,你们有临时表吗?将 ID 插入临时表,然后从临时表中选择连接到表以返回行,然后删除。
  • 是否允许删除顶部?
  • 即使有order by子句也不允许top 100?

标签: sql teradata


【解决方案1】:

子查询不支持前 N 个选项

子查询中是不允许的,但你可以将它包装在一个派生表中:

DELETE FROM table 
WHERE idx IN 
 ( SELECT *
   FROM
    ( SELECT TOP 100 idx FROM table ORDER BY idx
    ) AS dt
 )

子查询可能是相关的,但不是派生表:-)

但是,你为什么真的需要这个? 希望不要陷入循环以获得较小的交易。

【讨论】:

  • 谢谢,这对我有用。
【解决方案2】:

您可以使用临时表。示例:

CREATE MULTISET VOLATILE TABLE tmp_top_100_idx AS
(SELECT TOP 100 * FROM table ORDER BY idx)
WITH DATA
ON COMMIT PRESERVE ROWS

DELETE FROM table 
WHERE idx IN (SELECT idx FROM tmp_top_100_idx)

【讨论】:

  • 感谢您的回答。可能会起作用,但@dnoeth 的答案更轻量级。
  • @ThorstenKranz 同意了。谢谢。