如果它为false或true,则删除重复值

时间:2017-11-21 02:44:18

标签: sql postgresql postgresql-9.4

所以,如果我有一张桌子:

col1  |  col2
 x    |   f
 x    |   t
 y    |   t 
 z    |   t 
 q    |   f
 q    |   t

对于所有重复值,我想保留false值。所以,

col1  |  col2
 x    |   f
 y    |   t 
 z    |   t 
 q    |   f

我如何在Postgres中执行此操作?提前致谢!

2 个答案:

答案 0 :(得分:1)

我是使用WITH clause检查表格中的谬误来做的,然后对该问题进行内联查询:

WITH false_vals AS
  (SELECT col1, col2
   FROM example_schema.table_with_dupes
   WHERE col2='f')

DELETE
FROM example_schema.table_with_dupes
WHERE col2 = 't'
  AND col1 IN
    (SELECT col1
     FROM false_vals)

要在执行此操作之前检查您要删除的内容,可以将DELETE行替换为SELECT *

答案 1 :(得分:0)

这假设你的桌子很多,但根据你的例子,我认为这样可行:

delete from my_table t1
where
  col2 and
  exists (
    select null
    from my_table t2
    where t1.col1 = t2.col1
    group by t2.col1
    having count (*) > 1
)

我假设您的t / f是布尔数据类型,而不是字符。如果这是一个错误的假设,您可以将not col2更改为col2 = 't'

一些警告:

  • 如果您有多个重复项,则会删除所有错误值,而不仅仅是第一个
  • 如果您有多个重复项,则会保留所有真实值,而不仅仅是一个
  • 如果您希望更有选择性地删除您删除的虚假值或保留哪些真实值,则可能会有所改变,但这取决于您的内容