SQL INNER JOIN更新不复制行

时间:2015-05-18 02:20:11

标签: sql sql-server tsql join

我有一个具有内部联接的更新查询。我希望这个查询由于连接而返回两列,但似乎QUERY只占用第一行并使用它来更新数据而忽略其余的。

这是我的更新命令

UPDATE [mamd]
    SET [Brand_EL] = IIF(CHARINDEX('ELECT', UPPER([mml].[Brand_Desc])) > 0, 'YES', [Brand_EL])
    FROM [mamd] [m]
         INNER JOIN [ior] [ir] ON [ir].[CLIENT_CUSTOMER_ID] = [m].[CustomerId] COLLATE Latin1_General_CI_AS
         INNER JOIN [maslist] [mml] ON [mml].[Model] = [ir].[MODEL] COLLATE Latin1_General_CI_AS

如果我选择这样的

SELECT [ir].[CLIENT_CUSTOMER_ID], IIF(CHARINDEX('ELECT', UPPER([mml].[Brand_Desc])) > 0, 'YES', [Brand_EL])
    FROM [mamd] [m]
         INNER JOIN [ior] [ir] ON [ir].[CLIENT_CUSTOMER_ID] = [m].[CustomerId] COLLATE Latin1_General_CI_AS
         INNER JOIN [maslist] [mml] ON [mml].[Model] = [ir].[MODEL] COLLATE Latin1_General_CI_AS

我收到以下数据

CLIENT_CUSTOMER_ID | Brand_EL
-------------------+----------
980872             | NO 
980872             | YES

我认为它只拍了一张唱片的原因是因为

  1. 值永远不会变为"是"
  2. 当我运行更新命令时,它表示只更新了1行,即使它应该已经完成​​了两行
  3. 可能导致此问题的一件事是[mamd]不包含同一用户的多条记录;这是一个独特的领域。由于它是一个唯一的字段,因此只有一行,这是否意味着它只运行一次连接?如果是这样的话,我是否有更好的方法可以在没有嵌套选择的情况下生成结果?

    更新

    嘿所有人,

    就像更新一样,我接受了Gordons Advice并使用聚合。在我的这个例子中,我只关心价值是"是'因为我只需要知道客户是否购买了特定产品。所以我最终做的是按客户ID分组并使用MAX功能。如果客户购买了产品,"是"会冒泡到顶端。如果他没有,它将保持为NO或NULL。在那种情况下,这并不重要。

1 个答案:

答案 0 :(得分:4)

行为是正确的并且有记录,但不是很清楚:

  

指定FROM子句以提供条件时要小心   用于更新操作。 UPDATE语句的结果是   如果语句包含不是的FROM子句,则为undefined   以这样的方式指定,每个只有一个值可用   更新的列出现,即UPDATE语句是否   不确定。例如,在UPDATE语句中   在下面的脚本中,Table1中的两行都符合该资格   UPDATE语句中的FROM子句;但它未定义哪一行   来自Table1用于更新表2中的行。

这是试图说明一行仅由update更新一次。使用哪个值是不确定的。因此,如果您需要决定如何处理多个匹配项。