Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 编写同一查询的两种方法_Sql Server_Tsql - Fatal编程技术网

Sql server 编写同一查询的两种方法

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

我正在使用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 > '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,则可能是最快的更新