2016-03-31 4 views
0

У меня есть 1 проблема и вам нужна помощь.Sql server - как обновить колонку внутри join

У меня есть 2 стола - MainTable и DWTable.

MainTable - (ItemName varchar(255) NULL (unique), ItemCode varchar(255) NULL), 
DWTable - (ItemName varchar(255) NULL, ItemCode varchar(255) NULL). 

Общая рубрика - ItemName varchar (255) NULL.

ItemName уникален в MainTable, но несколько в DWTable.

Теперь мне нужно обновить MainTable.ItemCode от DWTable.ItemCode. Как MainTable имеет только 1 запись, которая может быть соединена с несколькими столбцами в DWTable.We есть много вариантов для MainTable.ItemCode

DWTable.ItemCode может иметь 3 вида значений -

  • А. not like '%Red%' and not like '%Yellow%' - - приоритет 1
  • Б. like '%Red%' - приоритет 2
  • С. Like '%yellow%' --- приоритет 3

Если A не существует, значение должно быть B else C.

Пожалуйста, помогите.

update MainTable 
set ItemCode = DWTable.ItemCode 
from Maintable inner join DWTable on MainTable.ItemName = DWTable.ItemName 

Для 1 элемента ItemName 'RREE', DWTable имеет 6 записей. , поэтому MainTable.ItemCode будет обновлен значением 6-й строки DWTable. За 1 Имя товара 'RREERR', у нас около 80 записей

+2

Покажите нам пример данных и ожидаемый результат. \t Прочитайте [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t И вот отличное место для [** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/), чтобы узнать, как улучшить качество вопроса и получить лучшие ответы. –

+1

Не могли бы вы предоставить запрос или запросы, которые вы пробовали? – Steven

+0

Привет, Jaun, Стивен.обновление MainTable set ItemCode = DWTable.ItemCode из внутреннего соединения внутренней таблицы DWTable на MainTable.ItemCode = DWTable.ItemCode. Для 1 конкретной ItemCode 'RREE', DWTable имеет 6 записей. , поэтому MainTable.ItemCode будет обновлен значением 6-й строки DWTable.For 1 ItemCode 'RREERR', у нас есть около 80 записей. –

ответ

0

Возможно, вы сможете делать то, что хотите, с помощью CTE.

WITH cte AS (
    SELECT ItemName, 
      ItemCode, 
      ROW_NUMBER() OVER (PARTITION BY ItemName ORDER BY 
        (CASE WHEN ItemCode NOT LIKE '%Red%' AND ItemCode NOT LIKE '%Yellow%' THEN 1 
          WHEN ItemCode LIKE '%Red%' THEN 2 
          ELSE 3 END)) AS [ItemCodeOrder] 

    FROM DWTable 
) 
UPDATE mt 
SET  mt.ItemCode = cte.ItemCode 
FROM Maintable mt 
     INNER JOIN cte ON mt.ItemName = cte.ItemName AND [ItemCodeOrder] = 1 

СТЕ прикажет ItemCodes за ITEMNAME от DWTable на основе ваших приоритетов с использованием ROW_NUMBER. Вы можете определить, как вы хотите обрабатывать случай, когда есть несколько значений, которые соответствуют выбранному приоритету.

SQL Fiddle Demo

+0

Большое спасибо JamieD77 за решение, оно сработало и подписано также !!! –

1
update MainTable 
set ItemCode = (
    select top 1 dw.ItemCode 
    from DWTable dw 
    where dw.ItemName = MainTable.ItemName /* same full name here for correlation */ 
    order by 
     case 
      when dw.ItemCode not like '%Red%' and dw.ItemCode not like '%Yellow%' then 1 
      when dw.ItemCode like '%Red%' then 2 
      when dw.ItemCode like '%Yellow%' then 3 
     end 
) 

Моя первая мысль что-то подобное, что, хотя я обычно избегают top. Большая проблема, которую я вижу, заключается в том, что вы явно будете иметь связи в приоритетных ковшиках.

Для всех практических целей я дублировал ответ JaimeD77, который не появился, когда я разместил свой. Вы можете увидеть вариацию на тему упорядочения по приоритету и взяв первый. Использование предложения from в update может привести к некоторым проблемам, поэтому есть причины поддержать подход подзапроса.

+0

Спасибо Shawnt00 за решение !! –