我面临 1 个问题,需要帮助。
我有 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%'
——优先级1like '%Red%'
——优先级2Like '%yellow%'
---优先级3如果 A 不存在,则值应为 B,否则为 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 个项目名称“RREERR”,我们有大约 80 条记录
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
子句可能会带来一些问题,因此有理由支持子查询方法。
您也许可以使用 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 的 ItemCode 进行排序。您可能想要定义如何处理有多个值满足所选优先级的情况。