编写同一查询的两种方法

时间:2017-05-17 21:17:15

标签: sql-server tsql

我正在使用northwind数据库,我编写了一个查询,将Quantity减少了20%并将Discount设置为给定值:

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]

1 个答案:

答案 0 :(得分:1)

这将是您的第3个版本使用来自内部联接的更新.. 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)