私はMS SQL 2008でSQLコンパクトデータベース(sdf)を使用しています。テーブル 'ジョブ'では、各IDには複数のジョブがあります。 システムに定期的にジョブがテーブルに追加されています。古いレコードを削除し、コンパクトで最新の10個を保つ
私は
どのように私は私のクエリを作成することができます 彼らの「datecompleted」で各ID順のための10回の最新の記録を維持したいとレコードの残りの部分を削除しますか?以下のようなものについては、テーブルとカーソル
私はMS SQL 2008でSQLコンパクトデータベース(sdf)を使用しています。テーブル 'ジョブ'では、各IDには複数のジョブがあります。 システムに定期的にジョブがテーブルに追加されています。古いレコードを削除し、コンパクトで最新の10個を保つ
私は
どのように私は私のクエリを作成することができます 彼らの「datecompleted」で各ID順のための10回の最新の記録を維持したいとレコードの残りの部分を削除しますか?以下のようなものについては、テーブルとカーソル
まあそれは速いので、ここでは、クリスマスに近づいているあなたに私の贈り物、私はそれはあなたが達成しようとしているということであると考えているものを示すサンプルスクリプトです。いいえ、大きな白いふわふわのひげがありません;-)
CREATE TABLE TestJobSetTable
(
ID INT IDENTITY(1,1) not null PRIMARY KEY,
JobID INT not null,
DateCompleted DATETIME not null
);
--Create some test data
DECLARE @iX INT;
SET @iX = 0
WHILE(@iX < 15)
BEGIN
INSERT INTO TestJobSetTable(JobID,DateCompleted) VALUES(1,getDate())
INSERT INTO TestJobSetTable(JobID,DateCompleted) VALUES(34,getDate())
SET @iX = @iX + 1;
WAITFOR DELAY '00:00:0:01'
END
--Create some more test data, for when there may be job groups with less than 10 records.
SET @iX = 0
WHILE(@iX < 6)
BEGIN
INSERT INTO TestJobSetTable(JobID,DateCompleted) VALUES(23,getDate())
SET @iX = @iX + 1;
WAITFOR DELAY '00:00:0:01'
END
--Review the data set
SELECT * FROM TestJobSetTable;
--Apply the deletion to the remainder of the data set.
WITH TenMostRecentCompletedJobs AS
(
SELECT ID, JobID, DateCompleted
FROM TestJobSetTable A
WHERE ID in
(
SELECT TOP 10 ID
FROM TestJobSetTable
WHERE JobID = A.JobID
ORDER BY DateCompleted DESC
)
)
--SELECT * FROM TenMostRecentCompletedJobs ORDER BY JobID,DateCompleted desc;
DELETE FROM TestJobSetTable
WHERE ID NOT IN(SELECT ID FROM TenMostRecentCompletedJobs)
--Now only data of interest remains
SELECT * FROM TestJobSetTable
DROP TABLE TestJobSetTable;
xmasギフトのためのthx ...コンパクト版では動作しませんが、私はそれを介して自分の道を見つけた – Kiddo
CTEの問題は何ですか?もしそうなら、派生テーブルのためにそれを交換してください。 –
方法を使用して#TEMPに失敗しました:
DELETE FROM
Job
WHERE NOT
id IN (
SELECT TOP 10 id
FROM Job
ORDER BY datecompleted)
これは、ネストされたSELECTは、このバージョン以降でのみ使用可能ですので、あなたが3.5を使用していると仮定しています。
私は質問を正しく読まなかった。私はCTEの行に沿った何かが、同様のロジックを使用して問題を解決するだろうと考えています。保存したいレコードを開始点として識別するクエリを作成したいとします。
idは一意ではないため、id1には30個のジョブがあり、id2には40個のジョブが含まれる可能性があります。あなたはクエリがトップ10のレコードしか保持しないようにします。私はid1のために10の仕事を保持したいと思いますid2などのための10の仕事 – Kiddo
私の誤解。テンポラリテーブルはサポートされていないため、ジョブテーブル上で一連のJOINを自分自身に実行するか、CTEで再生する必要があります。 –
SQLコンパクトでは一時テーブルとカーソルはサポートされていません。 SQL CompactとSQL Serverの違いは次のとおりです。http://technet.microsoft.com/en-us/library/bb896140.aspx –