Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在DELETE语句中使用行的物理位置(ROWID)_Sql_Database_Postgresql_Rowid - Fatal编程技术网

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)  ;