私は、自然な鍵とは何か、レコード間の差別化は何ですか?
これを解決するための簡単なT-SQLコーディングテストをしましょう。
以下のコードは、整数、日付、および文字を使用して簡単なテーブルを作成します。
-- Use a default db
USE [model];
GO
-- Create temp table
CREATE TABLE #Payments
(
DocumentNo int,
DocDate date,
ClearingDoc int,
PaymentType char(1)
);
GO
-- Clear table
TRUNCATE TABLE #Payments
GO
-- Add data
INSERT INTO #Payments VALUES (1, dateadd(d, -5, getdate()), 1, 'A');
INSERT INTO #Payments VALUES (2, dateadd(d, -4, getdate()), 1, 'B');
INSERT INTO #Payments VALUES (2, dateadd(d, -3, getdate()), 1, 'B');
INSERT INTO #Payments VALUES (1, dateadd(d, -2, getdate()), 1, 'A');
GO
-- Show data
SELECT * FROM #Payments
GO
このステートメントを実行すると、データは次のようになります。
自然キーは、文書番号、決済書類、支払タイプです。最も古い文書日付のレコードを探したい。
私は古いファッション・グループを使用して句を有する共通テーブル式を使用して好きです。
次のコードは、最も古い文書日付の重複レコードを返します。 CTE/DELETE文の中
-- Find the oldest records
SELECT DocumentNo, ClearingDoc, PaymentType, MIN(DocDate) AS OldestDate
FROM #Payments
GROUP BY DocumentNo, ClearingDoc, PaymentType
HAVING COUNT(*) > 1
なく、少なくとも最後に、パッケージのコード。
-- Remove duplicate data by oldest date
;
WITH CTE_DELETE_LIST AS
(
SELECT
DocumentNo,
ClearingDoc,
PaymentType,
MIN(DocDate) AS OldestDate
FROM
#Payments
GROUP BY
DocumentNo, ClearingDoc, PaymentType
HAVING
COUNT(*) > 1
)
DELETE
FROM #Payments
FROM #Payments AS P
JOIN
CTE_DELETE_LIST AS C
ON P.DocumentNo = C.DocumentNo and
P.ClearingDoc = C.ClearingDoc and
P.PaymentType = C.PaymentType and
P.DocDate = C.OldestDate
これは、2つの最も古い行を削除できる表のスナップショットです。
テーブル構造を追加すると、これはずっと簡単になります。どの列が主キーですか? – Zorkolot