为什么我的更新查询实际上没有更新?
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
子句。
我一直在尝试使用来自另一个 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
子句。