Sql server 编写同一查询的两种方法
我正在使用northwind数据库,我编写了一个查询,将数量减少20%,并将折扣设置为给定值:Sql server 编写同一查询的两种方法,sql-server,tsql,Sql Server,Tsql,我正在使用northwind数据库,我编写了一个查询,将数量减少20%,并将折扣设置为给定值: update dbo.[Order Details] set Quantity = round(0.8 * Quantity, 0), Discount = 0.5 where exists ( select * from dbo.Orders o where o.OrderID = dbo.[Order Details].OrderID and o.OrderDate
update dbo.[Order Details]
set Quantity = round(0.8 * Quantity, 0), Discount = 0.5
where exists (
select *
from dbo.Orders o
where o.OrderID = dbo.[Order Details].OrderID and
o.OrderDate > '1997-05-15'
)
select * from dbo.[Order Details]
它似乎工作得很好。我决定尝试使用join做同样的事情,而不是在where中绑定两个表。我想到了这个:
update dbo.[Order Details]
set Quantity = round(0.8 * Quantity, 0), Discount = 0.4
where exists (
select *
from dbo.Orders o join dbo.[Order Details] od on o.OrderID = od.OrderID
where o.OrderDate > '1997-05-15'
)
select * from dbo.[Order Details]
这个查询改变了[Order Details]表中的每一条记录——这在我看来很奇怪,因为子查询选择记录的条件与第一个查询相同。
为什么这两者的工作方式不同
编辑:
这个查询似乎实现了我想要的和第一个查询的功能
update dbo.[Order Details]
set Quantity = round(0.8 * Quantity, 0), Discount = 0.1
where OrderID in (
select o.OrderID
from dbo.Orders o inner join dbo.[Order Details] od on o.OrderID = od.OrderID
where o.OrderDate > '1997-05-15'
)
select * from dbo.[Order Details]
这将是您的第三个版本,正在使用来自内部连接的更新。。SQL Server
update d
set Quantity = round(0.8 * Quantity, 0), Discount = 0.5
from dbo.[Order Details] d
inner join dbo.Orders o
on o.OrderID = d.OrderID
where
o.OrderDate > cast('1997-05-15' as date)
第一个查询有一个相关的子查询,如果至少有一个详细信息的单个订单的OrderDate晚于指定的日期,则第二个查询将更新所有内容。短版本:查询的条件不同。MySQL!=T-SQL,不要发送垃圾邮件tags@Uueerdo我明白你对第二个查询的意思,但现在我不明白为什么第一个版本不能以这种方式工作-我在其中也使用了exists;这意味着它可以有效地连接到外部查询,但效率很低。第二个查询的子查询是自包含的。第三个查询的子查询实际上不需要有联接;它应该能够查询Orders表。一切正常。。但您尚未尝试从更新,如果您使用的是sql server,则可能是最快的更新