2016-11-11 6 views
1

私は処理できないSQL質問があります。NULLであり、同じ日付のテーブルから行を削除

テーブルから行を削除する必要があります。これらの行は、date_to列のNULLで、date_from列とは異なる値を持っています。

table

私は削除したい列には、それはDATE_FROMで同じ値を持ち、nullである数3

を有するものです。

これは私自身のアプローチでした:

select 
    date_from, id, count(*) number_of_rows_with_the_same_datefrom 
from 
    test 
group by 
    date_from, id 
having 
    count(*) > 1 

これは、この、そこから私は失われた:)

答えて

2

別のオプションは、私は、SELECT文を実行した

ID name date_from date_to RN 
2 Jim  2012-08-01 NULL 2 
+0

うんざりして働いてくれてありがとう。私は1時間を使い、完全に失われました。それはとてもシンプルに思えましたが、難しいことが判明しました。 – uba2012

+0

あなたはどのように動作するのか解説できますか? – uba2012

+0

@ uba2012あなたが知っているように、削除は非常に注意して行うべきです、私は大きな間違いを犯しました。 CTEまたは共通テーブル式は非常に便利です。また、Window functions/OVER句を快適に使うことができます。 CTE内でselectを実行するだけで、Row_Number()が何をしているのかをよりよく視覚化できます。 –

0

が存在するステートメントを使用して、同じIDを持つ日から同じを持っているすべての行を返します。それはかなりまっすぐ進むべきであるように思われる。

DELETE FROM table A 
WHERE exists (SELECT 1 
       FROM table B 
       WHERE A.Id = B.ID 
       and A.Date_from = B.date_from 
       and A.Name = B.Name 
       and B.Date_To is null) 

IDと名前とdate_fromがある種の鍵を作っていると仮定します...私は、PKがこのテーブルにあることを知ることがより快適だと思います。 (または存在する場合は一意のインデックス)

これが正しいかどうかを確認するには、これを最初に実行します。

SELECT * 
FROM table A 
WHERE exists (SELECT 1 
       FROM table B 
       WHERE A.Id = B.ID 
       and A.Date_from = B.date_from 
       and A.Name = B.Name 
       and B.Date_To is null) 
+0

こんにちは(レコードを削除する)CTEとROW_NUMBER()

;with cte as ( Select * ,RN=Row_Number() over (Partition By ID, date_from Order by date_to Desc) From YourTable ) Select * --<< Remove if Satisfied --Delete --<< Remove comment if Statisfied From cte Where RN>1 and date_to is null 

戻り値を使用することですが、それは仕事をdoesntの。それは2行を見つける。そして、テーブルに鍵がありません – uba2012

+0

こんにちはxQbertタイプ=日付 – uba2012

+0

うーん。なぜこれが機能するのか分かりません。名前に空白が含まれていたり、IDにスペースが含まれていたりしない限り(ユニークなインデックスが心配だった理由です)、固有のキーとしてrownumberを生成するのが最適な方法です。 – xQbert

関連する問題