2017-02-24 76 views
1

我有我的SQL數據庫中包含的數據, 其關於學生和他們用來登錄系統的卡片, 有時學生失去他們的卡,他們得到其中包含有關學生證的信息沒有更新, 其實加入新行一個又一個,但同一行,所以我們得到的情況:多行,具有多個值,如何獲得同一行更高的值ID

有一個學生,2卡,怎麼可能我確定哪一個是較新的,因爲沒有關於'DateCreated'的柱子或者沒有...

我還發現如果我看到更高的CardId fo [R相同的學生, 這意味着「更高」號是目前用戶活躍卡,所以我怎麼能刪除舊標識的..

這裏是照片: enter image description here

謝謝你們, 乾杯

+0

您使用的是什麼版本的SQL?這是知道的關鍵。 –

+0

請將樣品數據作爲格式文本發佈,而不是圖片。 (我無法讀取該圖片的小文本。) – jarlh

+0

@TimBiegeleisen它的微軟sql服務器 –

回答

0

一種方法是使用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其微軟SQL服務器 –

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 
相關問題