为什么我的更新查询实际上没有更新?

时间:2019-01-22 13:59:32

标签: sql-server sql-server-2008

我一直在尝试使用来自另一张表的信息进行更新查询,但是不知何故,而且我不知道为什么这样做

这就是我的查询方式:

UPDATE x
SET x.sheet_expedient=db_data.sheet_expedient 
FROM dbo_expedient_reports x
INNER JOIN  db_data ON x.sheet_expedient= db_data.sheet_expedient
WHERE x.sheet_expedient IS NULL

为什么这不起作用?预先感谢。

编辑

我看到有些人对表的结构有些困惑,在这里

dbo_expedient_reports

report_id|sheet_expedient|report_number|report_date|notificacion_date|report_status|
1        | NULL          | NULL        | NULL      | NULL            | NULL        |
2        | NULL          | NULL        | NULL      | NULL            | NULL        |
3        | NULL          | NULL        | NULL      | NULL            | NULL        |
4        | NULL          | NULL        | NULL      | NULL            | NULL        |
5        | NULL          | NULL        | NULL      | NULL            | NULL        |
6        | NULL          | NULL        | NULL      | NULL            | NULL        |
7        | NULL          | NULL        | NULL      | NULL            | NULL        | 
8        | NULL          | NULL        | NULL      | NULL            | NULL        |

db_data(这是我要放入dbo_expedient_reports的信息)

  sheet_expedient|report_date|name_expedient_owner|address_expedient|
  1              | 01-01-2011|mike                | his house 123   |
  2              | 06-06-2006|josh                | their house 456 |
  3              | 07-07-2007|andrew              | his place 789   |
  4              | 08-08-2008|frank               | somewhere 1111  |
  5              | 09-09-2009|chad                | anywhere 2222   |
  6              | 10-10-2010|zack                | nowhere 3333    |
  7              | 11-11-2011|steve               | everywhere 4444 |
  8              | 12-12-2012|mark                | here      5555  |

主要思想是工作表权宜信息进入实例的dbo_expedient报告,而db_data中的其他行进入另一个将放置该信息的表,您可能会认为工作表权宜与id一样,情况并非如此,因为sheet_expedient达到了一个极限(大约800),然后又重新开始,所以它与id不同,而sheet_expedient将达到数字800,然后又重新开始,因此id将是id 800 sheet_expedient 800和然后编号801 sheet_expedient 1

我希望能澄清一些疑问,以便更好地理解,感谢所有答复

4 个答案:

答案 0 :(得分:2)

根据您的评论,您在错误的列上输入了JOIN。解决方法是这里。

UPDATE x
SET x.sheet_expedient=db_data.sheet_expedient 
FROM dbo_expedient_reports x
INNER JOIN  db_data ON x.report_id = db_data.sheet_expedient --here is the change
WHERE x.sheet_expedient IS NULL

请注意,实际上所有要做的就是重复 report_id列。也就是说,report_id列将与sheet_expedient表的dbo_expedient_reports列匹配。我不确定这是什么意思。

此外,根据此示例数据,不需要WHERE子句。

答案 1 :(得分:1)

我不太确定您想达成什么目标。 如果期望x.sheet_expedient为NULL,那么为什么在联接中使用它呢? 您还有其他可用于联接两个表的字段吗?

答案 2 :(得分:0)

认为您需要左联接:

UPDATE x
SET x.sheet_expedient=db_data.sheet_expedient 
FROM dbo_expedient_reports x
LEFT JOIN  db_data ON x.sheet_expedient= db_data.sheet_expedient
WHERE x.sheet_expedient IS NULL

答案 3 :(得分:0)

要检查,请尝试以下操作:

WITH cte AS
    (SELECT         x.sheet_expedient       [FieldToUpdate]
     ,              db_data.sheet_expedient [NewValue]
     ,              *
       FROM         dbo_expedient_reports x
      INNER JOIN    db_data ON x.sheet_expedient = db_data.sheet_expedient
      WHERE         x.sheet_expedient IS NULL)
--UPDATE  cte    SET  [FieldToUpdate] = [NewValue];
SELECT  *   FROM  cte;

我通常在运行更新之前将更新包装到cte中。让我看到之前的值和之后的值。虽然这不能回答您的问题,但可以帮助您确定原因。

我已经注释掉了update语句,一旦选择返回了您期望的行和值,请取消注释更新,并注释掉选择。