UPDATE Postgresql where row ... else delete

时间:2013-05-16 19:48:35

标签: sql postgresql sql-update delete-row

这就是我所拥有的:

col1 | COL2

------ | ------
一个..... | x ......
一个..... | y ......
b ..... | y ......
c ..... | y ......
d ........ y ......
d ........ X .....

这就是我想要的:

col1 | COL2

------ | ------
一个..... | x ......
b ..... | y ......
c ..... | Ÿ......
d ..... | X ......

因此,当它与另一行中的x配对时,想法是删除col1与y配对的任何行。

我是sql的新手!我能做的最近的事情就是这个,但它并没有帮助...... https://stackoverflow.com/editing-help

谢谢: - )

4 个答案:

答案 0 :(得分:1)

尝试类似:

DELETE FROM your_table_name
WHERE col2 = 'y'
  AND col1 IN (SELECT col1
              FROM your_table_name 
              WHERE col2 = 'x')

答案 1 :(得分:1)

选择好行

SELECT DISTINCT ON (col1)
       col1, col2  -- add more columns
FROM   tbl
ORDER  BY col1, col2;

简短快速,包含更多列很容易。技术说明和链接:
Select first row in each GROUP BY group?

删除坏行

DELETE FROM tbl t1
USING  tbl t2
WHERE  t2.col1 = t1.col1
AND    t2.col2 = 'x'
AND    t1.col2 = 'y'

IN因大名单而出名 使用USING子句(自联接)再次添加表格,以使其更短更快 使用EXPLAIN ANALYZE验证效果。

答案 2 :(得分:0)

你真的想删除行吗?或者你只是想要一个返回你想要的查询?

对于您提供的数据,以下内容为您提供所需的结果:

select col1, min(col2) as col2
from t
group by col1;

表达逻辑的另一种方法是:

select t.*
from t
where not (t.col2 = 'Y' and
            exists (select 1 from t t2 where t2.col1 = t.col1 and t2.col2 = 'X')
          )

答案 3 :(得分:0)

根据Igor的回答,您可以添加一个触发器,以便在您的工作流程中自动执行此操作。

create or replace function auto_delete_y_rows() returns trigger as $$
begin
  delete from tbl
  where col2 = 'y'
  and col1 = new.col1;

  return null;
end;
$$ language plpgsql;

create trigger auto_delete_y_rows
after insert or update on tbl
for each row
  when (new.col2 = 'x')
execute procedure auto_delete_y_rows();