2017-02-24 13 views
1

私のSQLデータベースに含まれるデータを持っています。 システムにログインするために使用している生徒とそのカードに関する情報があります。 学生彼らのカードを失って別のカードを失うが、学生カードに関する情報が入っている同じ行が更新されていなかったので、 実際に新しい行が追加されたので、状況が得られた:複数の行、複数の値を持つ、同じ行IDの高い値を取得する方法

2人のカード私は "DateCreated"またはsmthについての列がないので、どちらが新しいかを決定します。

また、私が高いCardId fo 「高い」数は、現在のユーザーのアクティブカードですので、どのように私は古い同上のを取り除くことができることを意味し、Rと同じ学生、 ...ここ

写真です: enter image description here

みんなありがとう、 乾杯

+0

使用しているSQLのバージョンは?これは知るために重要です。 –

+0

サンプルデータを写真の代わりに書式付きテキストとして投稿してください。 (私はその絵の小さなテキストを読むことができません) – jarlh

+0

@TimBiegeleisenそのMicrosoft SQLサーバー –

答えて

0

1つのアプローチは、削除すべきレコードを識別するためにCTEを使用して自己結合を削除することです。 a)指定されたStudentIDのペアとして表示され、b)そのStudentIDの最小値がCardIDの場合、レコードを削除する必要があります。

WITH cte AS (
    SELECT StudentID, MIN(CardID) AS CardID 
    FROM yourTable 
    GROUP BY StudentID 
    HAVING COUNT(*) > 1  -- only do a delete if a pair be present 
) 
DELETE t1 
FROM yourTable t1 
INNER JOIN cte t2 
    ON t1.StudentID = t2.StudentID AND 
     t1.CardID = t2.CardID 
2

あなたはこの

DELETE a 
FROM <your table name> a 
WHERE EXISTS 
       (SELECT 1 
       FROM <your table name> b 
       WHERE b.StudentId = a.StudentId 
       AND b.CardId > a.CardId) 

このクエリは、同じStudentIdと削除されたレコードのCARDIDよりも大きなCARDIDの値を持つ他のレコードが存在するすべての生徒のレコードを削除します試みることができます。

+0

これはすべてのデータベースで機能しますか?使用されているデータベースはわかりません。 –

+0

移植性の高い、おそらくコアANSI SQL。 – jarlh

+0

@Tim BiegeleisenそのMicrosoft SQL Server –

0

カードIDが有効なIDであることを確認したら、テーブルに次のトリガーを実装して、テーブルに行を挿入すると古いレコードを自動的に削除します。

Create Trigger delete_old_record 
On <Your_Table_Name> 
After Insert 
AS 

delete from <Your_Table_Name> where [Student ID]=(select [Student ID] from Inserted) 
and [Card_ID]<(select [Card_ID] from Inserted) 

Go 
関連する問題