Не удалось связать многокомпонентный идентификатор в операторе where - PullRequest
1 голос
/ 17 апреля 2019

Я пытаюсь написать базовый запрос, который изменит значение, если данные из двух таблиц соответствуют правильным критериям.Выбор данных прекрасно работает с оператором where, который я использую, но при попытке установить значение возвращает ошибку «Не удалось связать ipartmidx_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 ]

1 голос
/ 17 апреля 2019

Вы бы использовали оператор 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,%'
0 голосов
/ 17 апреля 2019

Поскольку вы используете SQL Server 2008, вы можете сделать это с помощью CTE, который легко ограничивает записи, которые вы хотите обновить.

ПРИМЕЧАНИЕ: Я изменил способ, которым выформировали ваш JOIN.Вы делаете ЛЕВОЕ СОЕДИНЕНИЕ, а затем фильтруете ГДЕ.Это почти то же самое, что просто переместить условие WHERE в JOIN и переключиться на INNER JOIN.

SETUP

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 

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...