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

Откуда:
Сообщений: 54
Здравствуйте, подскажите плиз, как сделать вложенный запрос... БД SQL 2010
UPDATE AbstractCounter SET CounterValue = 20
WHERE Id = (SELECT Id FROM AccountCounter WHERE AccountId = (SELECT Id FROM Account WHERE AccountableId = (SELECT Id FROM Accessor WHERE ExternalId = '99')))

как можно этот update запустить для всех
ExternalId 
от 99 до 2000 ?
Можно почитать простенькие примеры на эту тему?
25 апр 17, 01:13    [20431283]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с простеньким вложенным запросом.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36900
lex871
БД SQL 2010
Нет такой СУБД.
lex871
как можно этот update запустить для всех
ExternalId
от 99 до 2000 ?
UPDATE AbstractCounter SET CounterValue = 20
WHERE Id = (SELECT Id FROM AccountCounter WHERE 
  AccountId = (SELECT Id FROM Account WHERE AccountableId = (SELECT Id FROM Accessor WHERE ExternalId in (select x.[Число] from [ТаблицаСЧислами] x where x.[Число] between 99 and 2000) )))
Таблицу с числами придется создать и заполнить.

Сообщение было отредактировано: 25 апр 17, 01:44
25 апр 17, 01:40    [20431296]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с простеньким вложенным запросом.  [new]
lex871
Member

Откуда:
Сообщений: 54
Сергей Алексеевич, спасибо за ответ.
а другой вариант возможен без создания дополнительной таблицы?
у меня уже есть таблица Accessor где есть все значения ExternalId, по ней можно формировать выборку?
25 апр 17, 01:47    [20431297]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с простеньким вложенным запросом.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36900
lex871
Сергей Алексеевич, спасибо за ответ.
а другой вариант возможен без создания дополнительной таблицы?
у меня уже есть таблица Accessor где есть все значения ExternalId, по ней можно формировать выборку?
Само собой, если есть все значения, не "можно", а "нужно". При этом, обязательно, чтобы в этих значениях null не затесался, или запрос придется через exists переписать.

Сообщение было отредактировано: 25 апр 17, 01:57
25 апр 17, 01:53    [20431298]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с простеньким вложенным запросом.  [new]
Massa52
Member

Откуда:
Сообщений: 379
Гавриленко Сергей Алексеевич
lex871
БД SQL 2010
Нет такой СУБД.
lex871
как можно этот update запустить для всех
ExternalId
от 99 до 2000 ?
UPDATE AbstractCounter SET CounterValue = 20
WHERE Id = (SELECT Id FROM AccountCounter WHERE 
  AccountId = (SELECT Id FROM Account WHERE AccountableId = (SELECT Id FROM Accessor WHERE ExternalId in (select x.[Число] from [ТаблицаСЧислами] x where x.[Число] between 99 and 2000) )))
Таблицу с числами придется создать и заполнить.


Мне, кажется, тут все "=" надо менять на "in"
25 апр 17, 03:32    [20431328]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с простеньким вложенным запросом.  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
lex871, у вас неправильная постановка вопроса.

вам не нужен вложенный запрос, вам нужно научиться писать JOIN'ы и UPDATE к запросам с JOIN'ами.

Вот ваш запрос, переписанный в таком стиле:

update as
set CounterValue = 20
from AbstractCounter as
inner join Account a on as.AccountID = a.ID
inner join Accessor ac on a.AccountableId = ac.ID
where ac.ExternalId = 99


соответственно, чтобы запустить его для всех ExternalId от 99 до 2000, нужно всего лишь поменять условие.

update as
set CounterValue = 20
from AbstractCounter as
inner join Account a on as.AccountID = a.ID
inner join Accessor ac on a.AccountableId = ac.ID
where ac.ExternalId between 99 and 2000


Ну это я сделал смелое предположение, что ExternalId у вас все таки типа int, что кажется логичным.
Если считать, что вы не зря сравниваете его со строковым значением '99', а не с числовым 99, и оно действительно строковое, тогда, да, нужно делать таблицу с числами, и присоединять ее по строковому представлению числа.
25 апр 17, 10:16    [20431721]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с простеньким вложенным запросом.  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Minamoto, ну я как всегда, накосячил в самом явном месте, присвоив алиас равным служебному слову :(

update acnt
set CounterValue = 20
from AbstractCounter as acnt
inner join Account as a on acnt.AccountID = a.ID
inner join Accessor as ac on a.AccountableId = ac.ID
where ac.ExternalId between 99 and 2000
25 апр 17, 10:18    [20431733]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с простеньким вложенным запросом.  [new]
lex871
Member

Откуда:
Сообщений: 54
Massa52
Гавриленко Сергей Алексеевич
пропущено...
Нет такой СУБД.
пропущено...
UPDATE AbstractCounter SET CounterValue = 20
WHERE Id = (SELECT Id FROM AccountCounter WHERE 
  AccountId = (SELECT Id FROM Account WHERE AccountableId = (SELECT Id FROM Accessor WHERE ExternalId in (select x.[Число] from [ТаблицаСЧислами] x where x.[Число] between 99 and 2000) )))
Таблицу с числами придется создать и заполнить.


Мне, кажется, тут все "=" надо менять на "in"

да, получилось всё с in
UPDATE AbstractCounter SET CounterValue = 20
WHERE Id in (SELECT Id FROM AccountCounter WHERE 
  AccountId in (SELECT Id FROM Account WHERE AccountableId in (SELECT Id FROM Accessor WHERE ExternalId in
   (select x.ExternalId from [Accessor] x where x.ExternalId between 30001 and 30002) )))


Если выставить = то ругается на
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.
26 апр 17, 01:16    [20434320]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с простеньким вложенным запросом.  [new]
lex871
Member

Откуда:
Сообщений: 54
Minamoto
Minamoto, ну я как всегда, накосячил в самом явном месте, присвоив алиас равным служебному слову :(

update acnt
set CounterValue = 20
from AbstractCounter as acnt
inner join Account as a on acnt.AccountID = a.ID
inner join Accessor as ac on a.AccountableId = ac.ID
where ac.ExternalId between 99 and 2000

Minamoto, спасибо большое за пример. В твоём варианте он немного не работает, но был стимул разобраться и всё получилось.
update acnt
set CounterValue = 20
from AbstractCounter as acnt
inner join AccountCounter as b on acnt.ID = b.ID
inner join Account as a on b.AccountID = a.ID
inner join Accessor as ac on a.AccountableId = ac.ID
where ac.ExternalId between 30001 and 30002
26 апр 17, 01:51    [20434331]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить