2017-02-21 133 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時,使用片段工具(看起來像一個頁面上的「<>」)。當你只包括敘述性文字時,不要使用。 –