我只需要在数据库中更新一条记录,并将其分配给用户。这就是我在做的事情:
UPDATE TOP (1) books SET assigneduser = 1
WHERE bookstatus = 7
AND ((assigneduser is null) or (assigneduser = 1));
我还有一个名为bookname的字段,我更喜欢按顺序排序,但更新似乎不支持它。
另请注意,我将有50个用户同时使用该软件,因此我需要确保只为一个用户分配了一本书。否则,我会首先运行一个选择,然后在顶部记录上运行更新。
感谢。
答案 0 :(得分:2)
您必须先选择所需的记录,然后更新它:
update books
set assigneduser = 1
where BookPrimaryKeyField = (
SELETE TOP 1 BookPrimaryKeyField
from books
WHERE bookstatus = 7
AND ((assigneduser is null) or (assigneduser = 1));
)
答案 1 :(得分:1)
如果您只想更新数据库中的一行,最好的方法是找出它的主键是什么并使用它。你可以这样说
UPDATE books SET assigneduser = 1
WHERE BOOKID
= (SELECT top 1 BOOKID FROM books where
bookstatus = 7
AND ((assigneduser is null) or (assigneduser = 1)));
答案 2 :(得分:0)
由于更新不会返回任何数据,并且'order by'对结果集进行排序,因此ORDER BY
无需处理任何数据,也无法完成您的搜索。
如果您只想分配一本书,可以使用您设置的前1位的连接进行更新。
UPDATE b0 SET assigneduser = 1
FROM b0
INNER JOIN
(SELECT top 1 id FROM books
WHERE user = 1 OR user is null
AND status =7) b1 ON b1.id = b0.id
或者可能不那么神秘
UPDATE user SET assigneduser = 1
WHERE id IN
(SELECT top 1 id FROM books
WHERE user = 1 OR user is null
AND status =7) b1 ON b1.id = b0.id
该策略在并发方面是否稳健是一个事务语义问题。
答案 3 :(得分:0)
UPDATE B
SET assigneduser = 1
FROM books B
WHERE bookstatus = 7
AND ((assigneduser is null) or (assigneduser = 1))
and bookid = (select min(bookid) from books where assigneuser is null)
我以为你有一个ID列bookid。
这样可以获得没有用户分配的最低图书ID,并将其连接到图书,为您提供单个记录(作为b的一部分),然后您可以更新。
答案 4 :(得分:0)
请看http://msdn.microsoft.com/en-us/library/ms177523.aspx。
如果必须使用TOP在有意义的年表中应用更新,则必须在子选择语句中将TOP与ORDER BY一起使用。以下示例使用最早的雇用日期更新10名员工的休假时间。
UPDATE HumanResources.Employee
SET VacationHours = VacationHours + 8
FROM (SELECT TOP 10 BusinessEntityID FROM HumanResources.Employee
ORDER BY HireDate ASC) AS th
WHERE HumanResources.Employee.BusinessEntityID = th.BusinessEntityID;
GO
答案 5 :(得分:0)
将此分为2件可能更容易
DECLARE @bookid as INT
SELECT TOP (1) @bookid = id FROM books
WHERE bookstatus = 7
AND ((assigneduser is null) or (assigneduser = 1))
ORDER BY bookname
UPDATE books SET assigneduser = 1
WHERE id = @bookid
答案 6 :(得分:0)
有一种方法可以通过使用子查询来解决它:
UPDATE books SET assigneduser=1
AND ((assigneduser is null) or (assigneduser = 1))
AND bookname in (SELECT TOP 1 bookname FROM Table ORDER BY bookname DESC)