2017-02-21 9 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 

Это прекрасно работает. Моя проблема в том, что в некоторых ситуациях в таблице «sales» имеется более одного совпадения с этим запросом, который, как правило, в порядке. Тем не менее, я хотел бы отсортировать эти результаты на основе другого поля, чтобы убедиться, что saleId я получаю тот, который имеет самую высокую стоимость.

Возможно ли это?

+0

Вы можете отправить образцы данных. и пример вывода. –

+0

Правильно ли указан синтаксис обновления ......... ?? Я думаю, что 'SET' отсутствует, и вы можете достичь того, чего хотите, используя подзапрос. И еще одна вещь 'e.saleId', где e table или псевдоним нигде не упоминается. – 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

TRY ЭТО:

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

Я уже говорил вам, и я еще раз скажу это. Вы неправильно используете инструмент snippet. Он предназначен для использования для HTML/JS/CSS, которые * фактически выполняются * на этом веб-сайте. Не для всего кода. –

+0

Пожалуйста, дайте мне знать Как использовать Как @GrabNewTech ans post –

+2

Когда вы включаете код (но не, в частности, HTML/JS/CSS), выделите код и используйте инструмент кода (выглядит как '{}'). Когда вы включаете HTML/JS/CSS, используйте инструмент фрагмента (выглядит как '<>' на странице). Когда вы просто включаете текст нарратива, не используйте ни того, ни другого. –

Смежные вопросы