Sql server - 如何更新连接内的列

时间:2016-03-31 15:31:36

标签: sql sql-server sql-server-2008

我面临一个问题,需要帮助。

我有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
  • B中。 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条记录

2 个答案:

答案 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。您可能希望定义如何处理有多个值满足所选优先级的情况。

SQL Fiddle Demo