使用TOP 1插入和删除语句
本文关键字:删除 语句 插入 TOP 使用 | 更新日期: 2023-09-27 18:14:35
我在写一个c#电影程序。如果电影预订一空,该程序将把用户移至等候名单。如果有人取消了电影的预订,等候名单上排名靠前的人将自动移到预订名单
我已经编码部分移动用户到等待名单,如果满了,它可以工作。现在我被困在从等待列表中选择顶级用户并将其移动到预订列表的部分。并从等候名单中删除该人记录
这是我从等待到保留的sql。
string myQry = "INSERT INTO reserve (ID,M_ID,R_Date) VALUES (SELECT TOP 1 (ID,M_ID,R_Date) FROM Wait WHERE M_ID=)" + mID+ " (ORDER BY R_Date ASC)";
这个sql删除那个人。
string myQry= "DELETE FROM Wait WHERE M_ID IN SELECT TOP 1 M_ID FROM Wait WHERE M_ID =" + mid;
我的其他函数工作完美,在编译和运行程序时没有错误。所以我认为,一定有一个问题在我的sql。请帮我一下,谢谢。
语法不正确:
INSERT INTO reserve (ID,M_ID,R_Date)
VALUES (SELECT TOP 1 (ID,M_ID,R_Date) FROM Wait WHERE M_ID= . . .
我想你的意思是:
INSERT INTO reserve (ID,M_ID,R_Date)
SELECT TOP 1 ID, M_ID, R_Date
FROM Wait WHERE M_ID = . . .;
列名周围的括号都是错误的,从select
到values
子句返回多个值也是错误的。
我应该补充一下,由于潜在的时间冲突,你正在做的事情似乎不安全。你应该调查OUTPUT
条款。一种方法是从wait
中删除记录,将其放在临时表中,然后插入到reserve
中。
您需要事务来保证安全,但是这些调整可能会起作用:
string myQry = "INSERT INTO reserve (ID,M_ID,R_Date) "
+ " SELECT TOP 1 (ID,M_ID,R_Date) "
+ " FROM Wait WHERE M_ID=" + mID + " "
+ " ORDER BY R_Date ASC";
delete:
string myQry = "DELETE FROM Wait WHERE ID IN "
+ " (SELECT TOP 1 ID FROM Wait WHERE M_ID =" + mID + " "
+ " ORDER BY R_Date ASC)";
注意:这可能是更好的检索上的Wait
表的自动增量ID到一个变量,然后使用它的插入和删除查询,但我不确定哪个SQL Server API你正在使用来编写检索所选值的例子。
PS—如果ID
是用户ID(看起来很有可能),您可能希望将其重命名为user_ID
之类的东西。另外,最好在Wait
表中使用一个自动递增的ID来标识一行。
可以是
DELETE TOP (1) FROM Wait WHERE M_ID = mid
你有多余的括号:
... WHERE M_ID = " + mid + " ORDER BY R_Date ASC)";