更新连接内的列

问题描述 投票:0回答:2

我面临 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 种类型的值 -

  • A.
    not like '%Red%' and not like '%Yellow%'
    ——优先级1
  • B.
    like '%Red%'
    ——优先级2
  • C.
    Like '%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 条记录

sql sql-server sql-server-2008
2个回答
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
投票

您也许可以使用 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 进行排序。您可能想要定义如何处理有多个值满足所选优先级的情况。

SQL Fiddle 演示

© www.soinside.com 2019 - 2024. All rights reserved.