2017-02-24 77 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 
相关问题