有没有办法从 table 中 SELECT TOP N 行然后删除它们?
Is there a way to SELECT the TOP N rows from a table and delete them afterwards?
我想在 Teradata 中实现以下目标。
鉴于table,我愿意
- 从 table 中获取前 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)。
是否有实现此行为的直接方法?理想情况下即使是匆忙,但我也可以使用锁。
我也查看了 Queue tables,但它们只允许 TOP 1
,所以显然设计为一次只弹出一个元素。
您可以使用临时 table。示例:
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)
Top N option is not supported in subquery
只是不允许在 子查询 中使用,但您可以将其包装在 Derived Table:
DELETE FROM table
WHERE idx IN
( SELECT *
FROM
( SELECT TOP 100 idx FROM table ORDER BY idx
) AS dt
)
子查询可能 相关,但不是派生的 Table :-)
但是,为什么你真的需要这个?
希望不要陷入循环以获得更小的交易。
我想在 Teradata 中实现以下目标。
鉴于table,我愿意
- 从 table 中获取前 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)。
是否有实现此行为的直接方法?理想情况下即使是匆忙,但我也可以使用锁。
我也查看了 Queue tables,但它们只允许 TOP 1
,所以显然设计为一次只弹出一个元素。
您可以使用临时 table。示例:
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)
Top N option is not supported in subquery
只是不允许在 子查询 中使用,但您可以将其包装在 Derived Table:
DELETE FROM table
WHERE idx IN
( SELECT *
FROM
( SELECT TOP 100 idx FROM table ORDER BY idx
) AS dt
)
子查询可能 相关,但不是派生的 Table :-)
但是,为什么你真的需要这个? 希望不要陷入循环以获得更小的交易。