【问题标题】:Update Query in SQL using Joins使用联接更新 SQL 中的查询
【发布时间】:2021-10-06 05:00:55
【问题描述】:

我正在使用带有 JOIN 子句的 SQL UPDATE 语句。

每当我更新表格时,都会为所有行更新相同的数据。

以下是用于更新表的 SQL 查询

update table3 set 
[C1]=TABLE2.CUSTOMER_ID,
[C2]=TABLE2.LOAN_AMOUNT,
[C3]=TABLE2.SOURCE,
[C4]=TABLE2.AMT,
[C5]=TABLE2.REG_NO,
FROM TABLE2 
INNER JOIN TABLE1  ON TABLE1.CID = TABLE2.CUSTOMER_ID
where TABLE2.CUSTOMER_ID IN (SELECT CID FROM TABLE1)

当我使用 select 语句选择上述查询时,数据不会重复。这是下面的声明。

select 
[C1]=TABLE2.CUSTOMER_ID,
[C2]=TABLE2.LOAN_AMOUNT,
[C3]=TABLE2.SOURCE,
[C4]=TABLE2.TEAM_MEMBER,
[C5]=TABLE2.TEAM_LEADER,
FROM TABLE2 
INNER JOIN TABLE1  ON TABLE1.CID = TABLE2.CUSTOMER_ID
where TABLE2.CUSTOMER_ID IN (SELECT CID FROM TABLE1)

让我知道更新查询中的问题是什么,因为 select 语句工作正常。

【问题讨论】:

  • 您需要一个介于 table3 和 table1 或 table2 之间的条件,例如 WHERE table3.someid = table2.someotherid 没有它,您选择的每一行都将应用于 table3 中的每一行。
  • @MatBailie;谢谢。我尝试添加条件“INNER JOIN table3 ON table3.[C1] = table2.CUSTOMER_ID”,但结果相同。 I,e 数据重复(每一行都相同)
  • 您与table3 中的行没有关联,因此每一行都在更新。您不应该更新您关联的同一列!
  • 密切注意我说过要把它放在WHERE 子句中的事实(Stu 提到的相关性),但您却使用了JOIN

标签: sql sql-server sql-update inner-join insert-update


【解决方案1】:

对于联合更新,您将要更新的表指定为 FROM 子句的一部分,然后在顶部使用其别名引用它:

我注意到WHERE 子句一旦加入就完全没有必要了

update t3
set 
 [C1] = t2.CUSTOMER_ID,
 [C2] = t2.LOAN_AMOUNT,
 [C3] = t2.SOURCE,
 [C4] = t2.AMT,
 [C5] = t2.REG_NO,
FROM TABLE2 t2
INNER JOIN TABLE1 t1 ON t1.CID = t2.CUSTOMER_ID
INNER JOIN table3 t3 ON t3.[C1] = t2.CUSTOMER_ID;

【讨论】:

  • 谢谢,我已经尝试使用以下语法。但结果相同code UPDATE TABLE3 SET [C1]=TABLE2.CUSTOMER_ID, [C2]=TABLE2.LOAN_AMOUNT, [C3]=TABLE2.SOURCE, [C4]=TABLE2.TEAM_MEMBER, [C5]=TABLE2.TEAM_LEADER ,从 T3.C1 = T1.CUSTOMER_ID T2.CID = T1.CUSTOMER_ID code987654325@ 上的 TABLE3 T3 INNER JOIN TABLE1 T1 = T1.CUSTOMER_ID INNER JOIN TABLE2 T2
  • @KarthickSamganghi 但这不是这个答案所建议的。答案是UPDATE T3,因此指的是连接中的实例,但您改为将其更改为UPDATE TABLE3,这会创建对该表的第二个独立引用。尝试做答案中的事情。
  • @KarthickSambanghi 确实,严格按照我写的,不要开始发明自己的语法
【解决方案2】:

根据你的 cmets 你可以试试这个...

UPDATE
  table3
SET
  [C2]=TABLE2.LOAN_AMOUNT,
  [C3]=TABLE2.SOURCE,
  [C4]=TABLE2.AMT,
  [C5]=TABLE2.REG_NO,
FROM
  table2
INNER JOIN
  table1
    ON table1.CID = table2.CUSTOMER_ID
WHERE
  table3.C1 = table2.CUSTOMER_ID

我还注意到,您曾多次尝试过给您的建议,但修改了建议的内容。在进行修改时,他们会破坏您被建议做的事情。

1)。如果您正在尝试某人建议的代码,请不要修改它。特别是如果您不完全了解修改的后果。

2)。如果您需要修改它,因为您的真实世界场景与您的问题中的简化示例略有不同,请模拟一个与您的问题完全匹配的测试环境。 (修改测试区域,而不是答案。)

我强烈建议您阅读以下内容:https://stackoverflow.com/help/minimal-reproducible-example

阅读后,在 dbfiddle.uk 上模拟一个示例,然后编辑您的问题以引用该小提琴。

这样就可以在完全相同的环境中测试提供给您的答案。无需修改答案中的代码。通过规定示例输入所需的输出,它还可以让您更清楚地展示您需要的行为。

您可能会犹豫是否要做出这种努力。但是如果没有它,你就会陷入误解给你的答案的混乱中。另外,如果你不能做出这样的努力,我们为什么要这样做?


例如...

使用我的回答中的模式:

使用@charlieface 的回答中的模式:

【讨论】:

    【解决方案3】:

    此语法有助于使用连接更新 sql 语句:

    UPDATE tablename  
    INNER JOIN tablename  
    ON tablename.columnname = tablename.columnname  
    SET tablenmae.columnnmae = tablenmae.columnname;
    

    【讨论】:

      猜你喜欢
      • 2021-07-25
      • 2015-11-03
      • 2013-11-03
      • 1970-01-01
      • 2015-08-01
      • 2010-11-02
      相关资源
      最近更新 更多