2017-02-21 129 views
0

我有一个脚本,根据条件更新该记录与另一个表匹配的表上的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 

这工作正常。我的问题是,在某些情况下,在“销售”表上有多个匹配,通常这个查询是可以的。但是,我想根据另一个字段对这些结果进行排序,以确保我获得的saleI是成本最高的那个。

这可能吗?

+0

您可以发送样本数据。并输出示例。 –

+0

上述更新语法是否正确......... ??我认为'SET'丢失了,你可以通过使用子查询来达到你想要的效果。还有一件事'e.saleId',其中e表或别名在任何地方都没有提及。 – Susang

+0

对不起,错误的语法,上面只是我正在做的一个表示,因为试图解释底层数据太难了,并且与我以前说过的问题 – Matt

回答

0

的答案都不工作,但我设法通过这样做,并Outer Apply我的加入,并在指定的排序顺序。

欢呼每个人的意见。

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) 
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表中没有匹配,而你让这些不变。但我想这在这里没有什么不同。

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 
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 
+1

无关,我会再说一遍。您正在使用片段工具错误。它旨在用于本网站上实际可运行的HTML/JS/CSS。不是所有的代码。 –

+0

请让我知道如何使用Like @GrabNewTech ans post –

+2

当您包含代码(但不是,特别是HTML/JS/CSS)时,突出显示代码并使用代码工具(看起来像'{}')。当你包含HTML/JS/CSS时,使用片段工具(看起来像一个页面上的“<>”)。当你只包括叙述性文字时,不要使用。 –