Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите новичку, UPDATE с условием на несколько таблиц  [new]
VLeshka
Member

Откуда:
Сообщений: 28
Две таблица вариантов покраски, vtpAffectingQuestions, и таблица названий покраски vtpValues. Связь между ними происходит через третью таблицу vtpTblVariants.
Составил выборку из таблицы vtpAffectingQuestions по названиям операций, имеющие в своём названии ' 2 цвета':
SELECT [TIB].[dbo].[vtpAffectingQuestions].[AValue_id], [TIB].[dbo].[vtpValues].[Value]
FROM [TIB].[dbo].[vtpAffectingQuestions], [TIB].[dbo].[vtpTblVariants], [TIB].[dbo].[vtpValues]
where [TIB].[dbo].[vtpAffectingQuestions].[AValue_id]=[TIB].[dbo].[vtpTblVariants].[Value_id]
and [TIB].[dbo].[vtpValues].[QValID]=[TIB].[dbo].[vtpTblVariants].[QValID]
and [TIB].[dbo].[vtpAffectingQuestions].[AValue_id] in (
select [TIB].[dbo].[vtpTblVariants].[Value_id]
FROM [TIB].[dbo].[vtpTblVariants],[TIB].[dbo].[vtpValues]
where [TIB].[dbo].[vtpTblVariants].[QValID]=[TIB].[dbo].[vtpValues].[QValID]
and [TIB].[dbo].[vtpValues].[QValID] in (
select [QValID] FROM [TIB].[dbo].[vtpValues]
where CHARINDEX(' 2 цвета',[TIB].[dbo].[vtpValues].[Value])>0
)
)
order by CAST([TIB].[dbo].[vtpAffectingQuestions].[AValue_id] as integer)

В результате выводит те варианты покраски из vtpAffectingQuestions, которые имеют в своём названии буквы ' 2 цвета'.

Эту выборку SELECT сделал для составления на его основе выборки UPDATE, тоесть "UPDATE в vtpAffectingQuestions операций, которые имеют в своём названии буквы ' 2 цвета'.
Пытался использовать алиасы и join - не получается. Запоролся здесь (отметил 1,2,3):
UPDATE Aff
SET Aff.[Question_id] = replace(Aff.[Question_id],'kkkkkkkkkkkkkkkk&72=|101|&','')
-- SET [TIB].[dbo].[vtpAffectingQuestions].[AQuestion_id] = 304
from [TIB].[dbo].[vtpAffectingQuestions] Aff
join [TIB].[dbo].[vtpTblVariants] Varian on
Aff.[AValue_id]=Varian.[Value_id]
join [TIB].[dbo].[vtpValues] Value on
Value.[QValID]=Varian.[QValID] --досюда всё нормально
and Aff.[AValue_id] in ( --1.in тут не принимает, не принимает и в where
select Varian.[Value_id] --2.
FROM Varian,Value --3.Если эти 3 строки убрать, но переваривает

--WHERE [TIB].[dbo].[vtpAffectingQuestions].[AQuestion_id]=100000000000000

where Aff.[AValue_id]>=1247
and Aff.[AValue_id]=Varian.[Value_id]
21 авг 12, 09:43    [13041127]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку, UPDATE с условием на несколько таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
VLeshka,

оформите с тегом SRC, пожалуйста.
И посчитайте количество открывающих и закрывающих скобок.
Вообще, запрос выглядит уродцем. Обычно подзапрос в ON не пишут. Хотя это вполне возможно.
Но он же должен быть в скобках.

Поскольку нет OUTER JOIN, то, возможно, лучше IN(SELECT ...) перенести в WHERE
21 авг 12, 09:51    [13041161]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку, UPDATE с условием на несколько таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
И не понял, что означает FROM Varian,Value ?
Декартово произведение двух таблиц? Ничем не ограниченное?
Хотя, в этом месте какие-то обрубки запросов. Так что умолкаю.
21 авг 12, 09:55    [13041172]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку, UPDATE с условием на несколько таблиц  [new]
SHok_by
Member

Откуда: Minsk
Сообщений: 51
Мне кажется тут слишком много намудрили.
21 авг 12, 09:59    [13041207]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку, UPDATE с условием на несколько таблиц  [new]
SHok_by
Member

Откуда: Minsk
Сообщений: 51
Я бы переписал первый запрос так:
SELECT 
  aq.AValue_id, 
  v.Value
FROM 
  TIB.dbo.vtpAffectingQuestions AS aq
  INNER JOIN TIB.dbo.vtpTblVariants AS tv
  ON aq.AValue_id = tv.Value_id
  INNER JOIN TIB.dbo.vtpValues AS v
  ON v.QValID = tv.QValID
where 
v.Value LIKE '% 2 цвета%'


и от него уже дальше отталкиваться.
21 авг 12, 10:02    [13041227]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку, UPDATE с условием на несколько таблиц  [new]
VLeshka
Member

Откуда:
Сообщений: 28
iap, с тегами SRC:
SELECT [TIB].[dbo].[vtpAffectingQuestions].[AValue_id], [TIB].[dbo].[vtpValues].[Value]
 FROM [TIB].[dbo].[vtpAffectingQuestions], [TIB].[dbo].[vtpTblVariants], [TIB].[dbo].[vtpValues]
where [TIB].[dbo].[vtpAffectingQuestions].[AValue_id]=[TIB].[dbo].[vtpTblVariants].[Value_id]
 and [TIB].[dbo].[vtpValues].[QValID]=[TIB].[dbo].[vtpTblVariants].[QValID]
 and [TIB].[dbo].[vtpAffectingQuestions].[AValue_id] in (
 select [TIB].[dbo].[vtpTblVariants].[Value_id] 
 FROM [TIB].[dbo].[vtpTblVariants],[TIB].[dbo].[vtpValues] 
 where [TIB].[dbo].[vtpTblVariants].[QValID]=[TIB].[dbo].[vtpValues].[QValID] 
 and [TIB].[dbo].[vtpValues].[QValID] in (
 select [QValID] FROM [TIB].[dbo].[vtpValues] 
 where CHARINDEX(' 2 цвета',[TIB].[dbo].[vtpValues].[Value])>0
)
)
order by CAST([TIB].[dbo].[vtpAffectingQuestions].[AValue_id] as integer)

FROM Varian,Value означает, что сравниваю с полями из Varian,Value. Или при этом можно было не использовать FROM Varian,Value ?

SHok_by намудрил, новичок ведь.
Тоесть, как я понял надо сперва написать select с использованием INNER JOIN и LIKE, а уж из него уже делать update.
21 авг 12, 10:20    [13041335]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку, UPDATE с условием на несколько таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
VLeshka,

читайте тут: http://msdn.microsoft.com/ru-ru/library/ms189499(v=sql.100)
и здесь: http://msdn.microsoft.com/ru-ru/library/ms177523(v=sql.100)
Это я про "сперва написать select с использованием INNER JOIN и LIKE, а уж из него уже делать update"

И не стОит писать везде [TIB].[dbo].[vtpAffectingQuestions].
Используйте алиасы.
21 авг 12, 10:28    [13041372]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку, UPDATE с условием на несколько таблиц  [new]
VLeshka
Member

Откуда:
Сообщений: 28
SHok_by, получилось так:
UPDATE Aff
   SET Aff.[Question_id] = replace(Aff.[Question_id],'kkkkkkkkkkkkkkkk&72=|101|&','')
from [TIB].[dbo].[vtpAffectingQuestions] Aff
     join [TIB].[dbo].[vtpTblVariants] Varian on
     Aff.[AValue_id]=Varian.[Value_id]
     join [TIB].[dbo].[vtpValues] Value on
     Value.[QValID]=Varian.[QValID]
where Aff.[AValue_id]>=1247
     and Aff.[AValue_id]=Varian.[Value_id]
     and Aff.[AValue_id] in ( 
     select Varian.[Value_id] 
     FROM [TIB].[dbo].[vtpTblVariants] Varian,[TIB].[dbo].[vtpValues] Value  
     where Varian.[QValID]=Value.[QValID] 
          and Value.[QValID] in (
          select [QValID] FROM [TIB].[dbo].[vtpValues] Value
          where Value.Value LIKE '% 2 цвета%'
)
)

работает. Мож и намудрено%).
21 авг 12, 11:03    [13041643]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку, UPDATE с условием на несколько таблиц  [new]
SHok_by
Member

Откуда: Minsk
Сообщений: 51
VLeshka
SHok_by, получилось так:
UPDATE Aff
   SET Aff.[Question_id] = replace(Aff.[Question_id],'kkkkkkkkkkkkkkkk&72=|101|&','')
from [TIB].[dbo].[vtpAffectingQuestions] Aff
     join [TIB].[dbo].[vtpTblVariants] Varian on
     Aff.[AValue_id]=Varian.[Value_id]
     join [TIB].[dbo].[vtpValues] Value on
     Value.[QValID]=Varian.[QValID]
where Aff.[AValue_id]>=1247
     and Aff.[AValue_id]=Varian.[Value_id]
     and Aff.[AValue_id] in ( 
     select Varian.[Value_id] 
     FROM [TIB].[dbo].[vtpTblVariants] Varian,[TIB].[dbo].[vtpValues] Value  
     where Varian.[QValID]=Value.[QValID] 
          and Value.[QValID] in (
          select [QValID] FROM [TIB].[dbo].[vtpValues] Value
          where Value.Value LIKE '% 2 цвета%'
)
)

работает. Мож и намудрено%).


из условия можно убрать
and Aff.[AValue_id]=Varian.[Value_id]
так как оно избыточно.

ну и iap правильно посоветовал разобраться:

читайте тут: http://msdn.microsoft.com/ru-ru/library/ms189499(v=sql.100)
и здесь: http://msdn.microsoft.com/ru-ru/library/ms177523(v=sql.100)
21 авг 12, 11:30    [13041806]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить