Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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
如何在postgresql中只保留表的不同行_Sql_Postgresql - Fatal编程技术网

如何在postgresql中只保留表的不同行

如何在postgresql中只保留表的不同行,sql,postgresql,Sql,Postgresql,我有一个名为Host的表,其中保存了有关主机的信息(id、url、is_-verified等)。但是问题是,表中有相同主机的重复行。我只想保留每个主机的一行 id只有一个,因此我尝试创建一个具有相同列的新表,并尝试只提供disctinct表,但我没有找到方法。您可以进行如下查询: DELETE FROM table_name WHERE id NOT IN ( SELECT min(id) FROM table_name GROUP BY host_columns --exce

我有一个名为Host的表,其中保存了有关主机的信息(id、url、is_-verified等)。但是问题是,表中有相同主机的重复行。我只想保留每个主机的一行
id只有一个,因此我尝试创建一个具有相同列的新表,并尝试只提供disctinct表,但我没有找到方法。

您可以进行如下查询:

DELETE FROM table_name
WHERE id NOT IN (
   SELECT min(id)
   FROM table_name
   GROUP BY host_columns --except id
);
此查询获取每个主机行的最小id,并删除其余行


我知道id列是您的主键,如果id列也是重复的,则此查询将不会有用。

如果您希望查询每个主机返回一行,请使用
distinct on
。不清楚您如何定义“主机”。例如,如果希望每个
id
有一行,则:

select distinct on (id) t.*
from t
order by id;
或者,如果
url
是您定义“主机”的方式,那么您可以在查询中将
id
替换为
url

请注意,这将返回表中任意匹配的行。如果有一个特定的键,您可以将另一个键添加到“按排序”。例如,如果
url
定义了主机,并且您想要最大的
id
,您将使用:

select distinct on (url) t.*
from t
order by url, id desc;

您是否尝试过在列上使用DISTINCT子句:url、是否已验证等。?这可以用于多个列。我想您可以尝试在主机列上实现唯一索引查看(…):PS如果您有重复的
id
值,则还有唯一的
ctid
系统列:
选择ctid,*from host
正如您所说,id列是我的主键,但也是重复的,谢谢,id不是主键,主键不允许重复值。使用DISTINCT并将行复制到空表中。我知道主键必须是唯一的。问题是我已从另一个表中复制了数据,以便更好地进行排列,因此主键被复制到许多唯一的行(6000+)