【问题标题】:update query with inner join [0 rows updated]使用内部联接更新查询 [0 行已更新]
【发布时间】:2015-06-15 06:23:31
【问题描述】:

使用inner join 返回O row updated 更新表1 中的数据时,两个表都在不同的数据库中。我有替代方法来更新它,但我不知道为什么我的 INNER JOIN 查询出错了。

不适用于内部联接

UPDATE DB1.table1 
SET t1.column3='value3' 
from DB1.table1 t1 
INNER JOIN DB2.table2 t2 on t1.column2=t2.column2 
WHERE (t1.column1 = 'value1')
AND (t2.column3 = 'value3')

不使用内部联接的工作查询。

UPDATE DB1.table1 SET column3='value3' WHERE (column1 = 'value1')
AND (column3 = 'value3') AND (column2 in (select column2 from DB2.table2
where column3='value3' and column3='value3' and column4='value4'))



DB1..table1
column1 column2 column3 column4
c1  c2  c3a c4
c1  c2  c3a c4
c1  c2  c3b c4
c1  c2  c3b c4

DB2..table2
column1 column2 column3 column4
c1  c2  c3a c4
c1  c2  c3a c4
c1  c2  c3b c4

任何机构都可以提出这个建议吗?

【问题讨论】:

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


    【解决方案1】:

    您正在更新 DB1.table1 但设置列 t1.Column3 这就是为什么您没有更新任何行

    你应该这样做

    UPDATE DB1.table1 
    SET DB1.table1.column3='value3'
    FROM DB1.table1 t1
    INNER JOIN DB2.table2 t2 on t1.column2= t2.column2 
    WHERE (t1 .column1 = 'value1')
    AND (t2.column3 = 'value3')
    

    【讨论】:

      【解决方案2】:

      您的语句中有一些语法错误。在 SET 和 UPDATE 部分使用别名或使用 TableName,不要混用:

      UPDATE t1
      SET column3='value3' 
      from DB1.table1 t1 
      INNER JOIN DB2.table2 t2 on t1.column2=t2.column2 
      WHERE (t1.column1 = 'value1')
      AND (t2.column3 = 'value3')
      

      【讨论】:

        【解决方案3】:

        这是您需要用于 SQL Server 的语法:

        UPDATE t1 SET 
        t1.column3 = 'value3' 
        FROM DB1.table1 t1
        INNER JOIN DB2.table2 t2 ON t1.column2 = t2.column2 
        WHERE 
        (t1.column1 = 'value1') AND 
        (t2.column3 = 'value3')
        

        【讨论】:

          【解决方案4】:

          在你的第一个不工作的查询中:

          UPDATE DB1.table1 
          SET t1.column3='value3'
          .
          .
          .
          

          您提到了update 的表的实际名称,但在set 语句中您使用了alias,因此存在混淆。

          在第二个中你告诉过:

          UPDATE DB1.table1 SET column3= ...
          

          您使用了实际的表名和列名,这里没有任何问题,代码可以正常工作。

          所以当您使用别名时,请尝试在更新部分也使用它在任何地方使用实际名称,下面的两个查询应该适合您:

          UPDATE DB1.table1 
          SET DB1.table1.column3=DB2.table2.column3  
          FROM DB1.table1
          JOIN DB2.table2 ON DB1.table1.column2=DB2.table2.column2 
                          AND DB1.table1.column1 = 'value1'
                          AND DB2.table2.column3 = 'value3'
          

          UPDATE t1 
          SET t1.column3=t2.column3  
          FROM DB1.table1 t1
          JOIN DB2.table2  t2 ON t1.column2=t2.column2 
                              AND t1.column1 = 'value1'
                              AND t2.column3 = 'value3'
          

          【讨论】:

          • 我发现了我的错误,谢谢你的解释。
          猜你喜欢
          • 2015-08-01
          • 1970-01-01
          • 2013-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-21
          • 1970-01-01
          相关资源
          最近更新 更多