我一直在尝试使用来自另一张表的信息进行更新查询,但是不知何故,而且我不知道为什么这样做
这就是我的查询方式:
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
我希望能澄清一些疑问,以便更好地理解,感谢所有答复
答案 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语句,一旦选择返回了您期望的行和值,请取消注释更新,并注释掉选择。