不能在where语句中绑定多部分标识符

时间:2019-04-17 18:15:29

标签: sql sql-server

我正在尝试编写一个基本查询,如果两个表中的数据符合正确的条件,则该查询将更改值。使用我正在使用的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,%'

2 个答案:

答案 0 :(得分:1)

您将使用select语句来确定将更新多少条记录。但是要进行update,您需要编写update语句,以便它包含您在select语句中编写的所有条件。

这包括from子句中的两个表,别名为xy,这使得在语句的其余部分中易于引用它们。

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