更新时定义排序顺序

时间:2017-02-21 05:49:23

标签: sql sorting sql-server-2012 sql-update

我有一个脚本可以更新一个表上的ID字段,该表根据条件与另一个表匹配。

以下是我查询的一般结构。

update p.saleId = e.saleId
from products p inner join sales s on s.crit1 = p.crit1
where p.someDate between s.startDate and s.endDate

这很好用。我的问题是,在某些情况下,使用此查询在'sales'表上存在多个匹配,这通常是可以的。然而,我想根据另一个字段对这些结果进行排序,以确保我得到的saleId是成本最高的那个。

这可能吗?

5 个答案:

答案 0 :(得分:0)

我希望以下查询可以解决。根据你的问题写了非常高水平的草稿。请只考虑概念而不是语法。

with maxSales as (select salesId, crit1 from sales s1
        where cost = (select max(cost) from 
        sales s2 where s1.crit1 = s2.crit1)     
update products p set p.saleId = 
                 (select s.saleId from 
                   maxSales s
                   where s.crit1 = p.crit1
                   and p.someDate between s.startDate and s.endDate)

答案 1 :(得分:0)

由于您要设置的saleID和正在查找的sales表,您可以更新所有products条记录。然后,您可以在表上编写一个简单的更新语句,而不必加入。这使得写起来更容易:

update products p
set saleId =
(
  select top(1) s.saleId
  from sales s
  where s.crit1 = p.crit1
    and p.someDate between s.startDate and s.endDate
  order by cost desc
);

你的陈述的主要区别在于,我设置了saleId = NULL,其中sales表中没有匹配,而你让它们不受影响。但我想这不会有所作为。

答案 2 :(得分:0)

尝试:

UPDATE p
SET p.saleid = s.saleid
FROM products p
INNER JOIN
  (SELECT s.crit1,
          s.saleid
   FROM sales s
   WHERE cost IN
       (SELECT max(cost) cost
        FROM sales
        GROUP BY crit1)) s ON s.crit1 = p.crit1

答案 3 :(得分:0)

UPDATE p 
   set p.saleId = e.rowNumber  
FROM products p
INNER JOIN 
(SELECT saleId, row_number() OVER (ORDER BY saleId DESC) as rowNumber
FROM sales) 
e ON e.saleId = p.saleId

答案 4 :(得分:0)

没有一个答案有效,但我设法通过使用和Outer Apply作为我的联接,并在其中指定了排序顺序。

为每个人提供输入。