SQL:有没有办法在更新语句中使用Order By?

时间:2011-06-10 18:41:25

标签: sql sql-update

我只需要在数据库中更新一条记录,并将其分配给用户。这就是我在做的事情:

UPDATE TOP (1) books SET assigneduser = 1
WHERE bookstatus = 7
AND ((assigneduser is null) or (assigneduser = 1));

我还有一个名为bookname的字段,我更喜欢按顺序排序,但更新似乎不支持它。

另请注意,我将有50个用户同时使用该软件,因此我需要确保只为一个用户分配了一本书。否则,我会首先运行一个选择,然后在顶部记录上运行更新。

感谢。

7 个答案:

答案 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)