2

データを含むテーブルがあり、列の1つにテキストとして格納されている数値が含まれています。アプリケーションがそれを更新すると、_BAK番号の後ろに+日時スタンプが書き込まれます。

_BAK現在、最新のレコードを削除してはならない番号列にあるすべてのレコードを削除して、データベースをクリーンアップしようとしています。

id     sitenummer                  
28376  1441_BAK20130213151952032    
28377  1441_BAK20130214142314705    

この場合、ID 28376の行が最も古いため、削除する必要があります。

私はまさにそれを行うべきクエリを作成しました:

;with sel1 AS (
select t1.ID,t1.sitenummer, CONVERT(BIGint,SUBSTRING(t1.sitenummer,CHARINDEX('_',t1.sitenummer,0)+4,50)) as Stamp1    
from vdfkraan as t1
where t1.sitenummer like '%_BAK%' and (SELECT COUNT(SUBSTRING(t2.sitenummer,0,CHARINDEX('_',t2.sitenummer,0))) FROM vdfkraan as t2 
                                      where SUBSTRING(t1.sitenummer,0,CHARINDEX('_',t1.sitenummer,0))=SUBSTRING(t2.sitenummer,0,CHARINDEX('_',t2.sitenummer,0))) > 1
group by t1.id,t1.sitenummer)

, sel2 AS (
select t3.id, t3.sitenummer, t3.stamp1, 
      (select TOP(1) t4.stamp1 from sel1 as t4
        WHERE SUBSTRING(t4.sitenummer,0,CHARINDEX('_',t4.sitenummer,0)) =SUBSTRING(t3.sitenummer,0,CHARINDEX('_',t3.sitenummer,0))
        order by t3.Stamp1 DESC) AS stamp2 from sel1 as t3)

, sel3 AS (select id from sel2 where Stamp1=stamp2)

--delete FROM vdfkraan
--where id IN (SELECT t1.id FROM sel3 as t1)

--select * from sel2

最後の行のコメントを外すと(sel2から*を選択)、次のテーブルが生成されます。

id     sitenummer                 stamp1             stamp2
28376  1441_BAK20130213151952032  20130213151952032  20130213151952032
28377  1441_BAK20130214142314705  20130214142314705  20130213151952032

テーブルsel3には、1つの列を持つ1つのレコードが含まれていますid = 28376

だから、それは私が望むようにうまくいくようです。

次に、選択行にコメントを付け、削除行のコメントを解除します。

今、私は次のエラーを受け取ります:

Msg 8114, Level 16, State 5, Line 2
Error converting data type varchar to bigint.

したがって、削除行がなければ、すべて問題なく、エラーはありませんが、削除行があると、このエラーが発生します。データを確認しましたが、問題ないはずです。

ここで何が起こっているのですか?

4

2 に答える 2

2

これを試してください:

SELECT  v.ID
        , v.sitenummer
        , ROW_NUMBER() OVER (PARTITION BY LEFT(v.sitenummer, PATINDEX('%_BAK%', v.sitenummer) - 1) ORDER BY v.id DESC) num
INTO    #temp
FROM    vdfkraan v
WHERE   PATINDEX('%_BAK%', v.sitenummer) > 0

DELETE  vdfkraan
FROM    #temp t
JOIN    vdfkraan v ON v.id = t.id
AND     t.num <> 1

SELECT  *
FROM    vdfkraan

ここにSQLフィドルがあります

于 2013-02-14T15:00:19.360 に答える
0

ウィンドウ関数の代わりにグループ化を使用できると思います:

SELECT  max(id), max(sitenummer)
FROM    vdfkraan
group by left(sitenummer,charindex('_BAK',sitenummer));
于 2013-02-16T12:55:22.173 に答える