我面临一个问题,需要帮助。
我有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中是多个。
现在,我需要从DWTable.ItemCode更新MainTable.ItemCode。 由于MainTable只有1条记录,可以与多列DWTable连接。我们有很多选项可用于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将由DWTable的第6行值更新。 对于1 Itemname'RREERR',我们有大约80条记录
答案 0 :(得分: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
子句可能会引入一些问题,因此有理由支持子查询方法。
答案 1 :(得分: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
CTE将使用ROW_NUMBER根据您的优先级从DWTable订购每个ItemName的ItemCodes。您可能希望定义如何处理有多个值满足所选优先级的情况。