0

ここに私が持っているものがあります:

列1 | col2

------| ------
あ……| ×……あ……
| y……
b……| y……
c……| y……
d……| y……
d……| バツ.....

ここに私が欲しいものがあります:

列1 | col2

------| ------
あ……| x……
b……| y……
c……| y……
d……| バツ......

したがって、col1 が別の行で x ともペアになっている場合に、それが y とペアになっている行を削除するという考え方です。

私はSQLが初めてです!私がうまくできる最も近いものはこれですが、それは役に立ちません... https://stackoverflow.com/editing-help

ありがとう :-)

4

4 に答える 4

1

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();
于 2013-05-16T20:36:08.130 に答える
1

次のようなものを試してください:

DELETE FROM your_table_name
WHERE col2 = 'y'
  AND col1 IN (SELECT col1
              FROM your_table_name 
              WHERE col2 = 'x')
于 2013-05-16T19:54:27.623 に答える
1

良い行を選択する

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

短くて高速で、より多くの列を簡単に含めることができます。手法の説明とリンク:
各 GROUP BY グループの最初の行を選択しますか?

不良行の削除

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

IN大きなリストでは遅いことで有名です。
節 (self-join) を使用してもう一度テーブルを追加して、USINGこれをより短く、より高速にします。
で性能を確認しEXPLAIN ANALYZEます。

于 2013-05-16T21:11:43.807 に答える
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')
          )
于 2013-05-16T19:54:08.220 に答える