Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 多行,具有多个值,如何为同一行ID获取更高的值_Sql_Sql Server_Select_Numbers - Fatal编程技术网

Sql 多行,具有多个值,如何为同一行ID获取更高的值

Sql 多行,具有多个值,如何为同一行ID获取更高的值,sql,sql-server,select,numbers,Sql,Sql Server,Select,Numbers,我的SQL数据库中包含数据, 这是关于学生和他们用来登录系统的卡片, 有时学生会丢失他们的卡,然后他们会得到另一张卡,但包含学生卡信息的同一行没有更新, 事实上,添加了新行,因此我们得到了以下情况: 有一个学生有两张卡片,我怎么能确定哪张是新的,因为没有关于“DateCreated”或smth的栏 我还发现如果我看到同一个学生的卡迪更高, 这意味着“更高”的号码是用户当前的活动卡,所以我如何删除旧Id 照片如下: 谢谢各位, Cheers一种方法是执行删除自连接,使用CTE识别应该删除的记录。

我的SQL数据库中包含数据, 这是关于学生和他们用来登录系统的卡片, 有时学生会丢失他们的卡,然后他们会得到另一张卡,但包含学生卡信息的同一行没有更新, 事实上,添加了新行,因此我们得到了以下情况:

有一个学生有两张卡片,我怎么能确定哪张是新的,因为没有关于“DateCreated”或smth的栏

我还发现如果我看到同一个学生的卡迪更高, 这意味着“更高”的号码是用户当前的活动卡,所以我如何删除旧Id

照片如下:

谢谢各位,
Cheers

一种方法是执行删除自连接,使用CTE识别应该删除的记录。如果记录A显示为给定StudentID的一对,而b是该StudentID的最小CardID,则应删除该记录

你可以试试这个

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。

如果您确定较高的卡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

您使用的是什么版本的SQL?了解这一点至关重要。请将样本数据以格式化文本而不是图片的形式发布。我看不懂那张图片的小文本。@TimBiegeleisen它的microsoft sql Server是的,你已经说过了,我在下面给了你一个查询。这对所有数据库都有效吗?我们不知道正在使用的数据库。可能是可移植的核心ANSI SQL。@Tim Biegeleisen其Microsoft SQLServer@TrungDuong你能更详细地解释一下吗?我已经编辑了我的答案。如果你还不清楚,请告诉我。
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