我有一个脚本可以更新一个表上的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是成本最高的那个。
这可能吗?
答案 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
作为我的联接,并在其中指定了排序顺序。
为每个人提供输入。