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

Why is my update query not actually updating?

我一直在尝试使用来自另一个 table 的信息进行更新查询,但不知何故不起作用,我无法弄清楚为什么会这样

我是这样查询的:

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

为什么这不起作用?提前致谢。

编辑

我看到有些人对 table 的结构有点困惑,这里是

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  |

主要思想是 sheet 权宜信息进入实例的 dbo_expedient 报告,而来自 db_data 的其他行进入另一个 tables,其中信息将被放置,您可能会认为,sheet 权宜之计与 id 相同,但事实并非如此,因为 sheet_expedient 达到限制(大约 800)然后重新开始,所以它是与 id 不同,而 sheet_expedient 将达到数字 800 然后重新开始,因此 id 将是 id 800 sheet_expedient 800 然后是 id 801 sheet_expedient 1

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

认为您需要左连接:

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

我不太确定您想实现什么。 如果 x.sheet_expedient 预计为 NULL 那么为什么要在连接中使用它? 您是否有任何其他字段可用于连接两个表?

要检查试试这个:

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 中。允许我查看之前的值和之后的值。虽然这不会回答您的问题,但它应该可以帮助您确定原因。

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

根据您的评论,您 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 列将匹配 dbo_expedient_reports table 的 sheet_expedient 列。我不确定这是什么意思。

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