Sql 如何在DELETE语句中使用行的物理位置(ROWID)
我有一个表,它有许多重复的行,没有主键。Sql 如何在DELETE语句中使用行的物理位置(ROWID),sql,database,postgresql,rowid,Sql,Database,Postgresql,Rowid,我有一个表,它有许多重复的行,没有主键。 我只想删除重复的记录,但当我尝试这样做时,它会删除所有对等点 如何从Postgres中的表中找到ROWID?在PostgreSQL中,行的物理位置称为CTID 因此,如果要查看它,请使用如下查询: SELECT CTID FROM table_name DELETE FROM table_name WHERE CTID NOT IN ( SELECT RECID FROM (SELECT MIN(CTID) AS RECID, other
我只想删除重复的记录,但当我尝试这样做时,它会删除所有对等点
如何从Postgres中的表中找到
ROWID
?在PostgreSQL中,行的物理位置称为CTID
因此,如果要查看它,请使用如下查询:
SELECT CTID FROM table_name
DELETE FROM table_name WHERE CTID NOT IN (
SELECT RECID FROM
(SELECT MIN(CTID) AS RECID, other_columns
FROM table_name GROUP BY other_columns)
a);
要在DELETE语句中使用它来删除重复记录,请按如下方式使用它:
SELECT CTID FROM table_name
DELETE FROM table_name WHERE CTID NOT IN (
SELECT RECID FROM
(SELECT MIN(CTID) AS RECID, other_columns
FROM table_name GROUP BY other_columns)
a);
请记住,table_name是所需的表,其他_列是要用于筛选该表的列
即:
将其简化为一个查询级别:
DELETE FROM table_name
WHERE ctid NOT IN (
SELECT min(ctid)
FROM table_name
GROUP BY $other_columns);
。。其中重复项在$other_列中由相等项定义
无需在SELECT
列表中包含groupby
子句中的列,因此不需要另一个子查询
< /p> 如果要根据唯一ID列(或时间戳)删除,则应考虑使用<代码> RooSnUnl()/>代码,因为<>代码> cTID不总是可靠的,当您只想保留最近的记录等时,
WITH d
AS (SELECT ctid c,
row_number()
OVER (
partition BY s
ORDER BY id) rn
FROM t)
DELETE FROM t
WHERE ctid IN (SELECT c
FROM d
WHERE rn > 1) ;