我可以在一个查询中从表中更新/选择吗?
时间:2020-03-05 18:47:34 来源:igfitidea点击:
我需要在查看页面时选择数据并更新"视图"列,有没有一种方法可以在一个查询中执行此操作,还是必须使用不同的查询?
解决方案
回答
我们将必须在一次交易中用两条语句执行此操作
Begin Tran Update Pages Set Views = Views + 1 Where ID = @ID Select Columns From Pages Where ID = @ID Commit Tran
回答
如果我们不想/不需要使用事务,则可以创建一个存储过程,该过程首先更新视图计数,然后选择值并将其返回给用户。
回答
PostgreSQL的UPDATE语句具有RETURNING子句,该子句将返回类似于SELECT语句的结果集:
UPDATE mytable SET views = 5 WHERE id = 16 RETURNING id, views, othercolumn;
我很确定这不是标准。我不知道是否有其他数据库实现了它。
编辑:我只是注意到问题具有" MySQL"标签。也许我们应该在问题本身中提及它。这是一个很好的通用数据库问题,尽管我想看看如何在其他数据库中做到这一点。
回答
如果我们列出了正在使用的RDBMS,这将有所帮助
SQL Server具有OUTPUT语句
例子
USE AdventureWorks; GO DECLARE @MyTestVar table ( OldScrapReasonID int NOT NULL, NewScrapReasonID int NOT NULL, WorkOrderID int NOT NULL, ProductID int NOT NULL, ProductName nvarchar(50)NOT NULL); UPDATE Production.WorkOrder SET ScrapReasonID = 4 OUTPUT DELETED.ScrapReasonID, INSERTED.ScrapReasonID, INSERTED.WorkOrderID, INSERTED.ProductID, p.Name INTO @MyTestVar FROM Production.WorkOrder AS wo INNER JOIN Production.Product AS p ON wo.ProductID = p.ProductID AND wo.ScrapReasonID= 16 AND p.ProductID = 733; SELECT OldScrapReasonID, NewScrapReasonID, WorkOrderID, ProductID, ProductName FROM @MyTestVar; GO
回答
我在Java和SQL Server上使用了这个技巧,并且还可以让我们在单个PreparedStatement中发送两个命令。
update tablex set y=z where a=b \r\n select a,b,y,z from tablex
但是,这需要处于已读提交事务中,才能像我们认为的那样工作。