我正在尝试编写一个基本查询,如果两个表中的数据符合正确的条件,则该查询将更改值。使用我正在使用的where语句选择数据可以很好地工作,但是尝试设置该值将返回错误“无法绑定多部分标识符” imitmidx_sql.item_desc_1”。
select
comp_item_no,
qty_per_par,
item_desc_1
from
bmprdstr_sql
Left Outer Join
imitmidx_sql
on
bmprdstr_sql.comp_item_no = imitmidx_sql.item_no
update
bmprdstr_sql
set
qty_per_par = '0'
where
bmprdstr_sql.comp_item_no like '68%' and
imitmidx_sql.item_desc_1 like 'WIRE,%'
使用以下查询,2300行受到影响,我想更改那些受影响的行,以使qty_per_par为0
select comp_item_no, qty_per_par, item_desc_1
from bmprdstr_sql
Left Outer Join imitmidx_sql
on bmprdstr_sql.comp_item_no = imitmidx_sql.item_no
where comp_item_no like '68%' and item_desc_1 like 'WIRE,%'
答案 0 :(得分:1)
您将使用select
语句来确定将更新多少条记录。但是要进行update
,您需要编写update
语句,以便它包含您在select
语句中编写的所有条件。
这包括from
子句中的两个表,别名为x
和y
,这使得在语句的其余部分中易于引用它们。
update x
set x.qty_per_par = 0
from bmprdstr_sql x left outer join imitmidx_sql y on x.comp_item_no = y.item_no
where x.comp_item_no like '68%'
and y.item_desc_1 like 'wire,%'
答案 1 :(得分:0)
由于使用的是SQL Server 2008,因此可以使用CTE轻松地限制要更新的记录。
注意::我更改了您准备加入JOIN的方式。您正在执行LEFT JOIN,然后使用WHERE进行过滤。这与将WHERE条件移到JOIN并切换到INNER JOIN几乎一样。
设置
CREATE TABLE t1 ( id int, words varchar(10) ) ; CREATE TABLE t2 ( id int identity, t1ID int, morewords varchar(10)) ; INSERT INTO t1 (id, words ) VALUES (1,'asfd'), (2, 'jklsemi'),(3,'qwerty') ; INSERT INTO t2 ( t1ID, morewords ) VALUES (1,'fdsa'),(1,'qq'),(3,'yy');
这给我们:
SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.t1id AND t2.morewords = 'fdsa'
id | words | id | t1ID | morewords -: | :---- | -: | ---: | :-------- 1 | asfd | 1 | 1 | fdsa
并执行我们的更新:
; WITH cte1 AS ( SELECT t1.id, t1.words FROM t1 INNER JOIN t2 ON t1.id = t2.t1id AND t2.morewords = 'fdsa' WHERE t1.words LIKE 'a%' ) UPDATE cte1 SET cte1.words = 'new' ;
然后提供给我们的信息:
SELECT * FROM t1
id | words -: | :------ 1 | new 2 | jklsemi 3 | qwerty
db <>提琴here