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

Откуда:
Сообщений: 5
Может кто объяснить, почему этот код выполняется без ошибок. По идее он не должен его выполнить из-за ошибки в последней строке, где
WHERE Id IN (SELECT id FROM Services)
.

;WITH Services AS
(
SELECT
serv.Amount 
FROM Recipient rec
JOIN IndividualProgram ip
ON ip.RecipientId = rec.Id
AND ip.IsDeleted = 0
JOIN SocialDocument socDoc
ON socDoc.IndividualProgramId = ip.Id
AND socDoc.IsDeleted = 0
JOIN ServicePeriod servPer
ON servPer.SocialDocumentId= socDoc.Id
AND servPer.IsDeleted = 0
AND servPer.Year = 2019
AND servPer.Month = 12
JOIN Service serv
ON serv.ServicePeriodId = servPer.Id
AND serv.IsDeleted = 0
AND serv.ServiceKindId = 33
WHERE rec.IsDeleted = 0
AND rec.ResidencePlaceId = 3

)

UPDATE Service
SET Amount = 8.11
WHERE Id IN (SELECT id FROM Services)
29 ноя 19, 15:20    [22028983]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Qwerty112233,

пишите алиасы... всегда... вообще всегда :)
29 ноя 19, 15:22    [22028985]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться  [new]
Qwerty112233
Member

Откуда:
Сообщений: 5
TaPaK,

Оно выполнится даже так
;WITH Services AS
(
SELECT
serv.Amount as something
....


UPDATE Service
SET Amount = 8.11
WHERE Id IN (SELECT id FROM Services)
29 ноя 19, 15:27    [22028989]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Qwerty112233,

ну тогда узнайте что такое алиасы...

UPDATE Service
SET Amount = 8.11
WHERE Id IN (SELECT a.id FROM Services as a)
29 ноя 19, 15:28    [22028993]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться  [new]
Qwerty112233
Member

Откуда:
Сообщений: 5
TaPaK,

Все это понятно и известно. Не понятно почему не возникает ошибки при выполнении этого кода?
29 ноя 19, 15:32    [22028996]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Qwerty112233
TaPaK,

Все это понятно и известно. Не понятно почему не возникает ошибки при выполнении этого кода?

потому что id берётся из того что внутри и если нет то выше

Сообщение было отредактировано: 29 ноя 19, 15:34
29 ноя 19, 15:34    [22028999]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться  [new]
Qwerty112233
Member

Откуда:
Сообщений: 5
TaPaK,

Не совсем понял мысль. Т.е. id в конструкции
SELECT id FROM Services
в данном случае берется не из Services, а из Service?
29 ноя 19, 15:36    [22029002]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Qwerty112233
TaPaK,

Не совсем понял мысль. Т.е. id в конструкции
SELECT id FROM Services
в данном случае берется не из Services, а из Service?

ага, где-то и написано, но лень искать. Все кто не пишет алиасы всегда на этом страдают и надеюсь очень сильно

https://docs.microsoft.com/en-us/sql/t-sql/queries/select-clause-transact-sql?view=sql-server-ver15
автор
Is the name of a column to return. Qualify column_name to prevent an ambiguous reference, such as occurs when two tables in the FROM clause have columns with duplicate names. For example, the SalesOrderHeader and SalesOrderDetail tables in the AdventureWorks2012 database both have a column named ModifiedDate. If the two tables are joined in a query, the modified date of the SalesOrderDetail entries can be specified in the select list as SalesOrderDetail.ModifiedDate.


Сообщение было отредактировано: 29 ноя 19, 15:40
29 ноя 19, 15:38    [22029006]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться  [new]
Qwerty112233
Member

Откуда:
Сообщений: 5
TaPaK,

Ну здесь немного другой случай, конечно. Ожидалось, что будет ошибка и этого вполне логично ожидать, как я считаю
29 ноя 19, 15:46    [22029015]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Qwerty112233
TaPaK,

Ну здесь немного другой случай, конечно. Ожидалось, что будет ошибка и этого вполне логично ожидать, как я считаю

ваше возмущение не знает пределов? в Редмонд!
29 ноя 19, 15:50    [22029024]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться  [new]
Shakill
Member

Откуда: мск
Сообщений: 1871
Qwerty112233
Ну здесь немного другой случай, конечно. Ожидалось, что будет ошибка и этого вполне логично ожидать, как я считаю

В подзапросе должна быть возможность обратиться и к полям подзапроса, и к полям вышестоящего набора данных. Каким образом сервер должен догадаться, что вы имели в виду именно поле в Services, по виду подзапроса?
29 ноя 19, 15:54    [22029029]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
Shakill
Qwerty112233
Ну здесь немного другой случай, конечно. Ожидалось, что будет ошибка и этого вполне логично ожидать, как я считаю

В подзапросе должна быть возможность обратиться и к полям подзапроса, и к полям вышестоящего набора данных. Каким образом сервер должен догадаться, что вы имели в виду именно поле в Services, по виду подзапроса?
+100500
Иначе как реализовать коррелированные подзапросы?
29 ноя 19, 17:56    [22029131]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30821
Qwerty112233
Ожидалось, что будет ошибка и этого вполне логично ожидать, как я считаю
Почему "ожидалось"??? поля из таблиц верхнего уровня разрешено использовать в подзапросах, разве вы этого не знали?

Большинство подзапросов для этого и пишут, их даже обычно называют коррелированными, подчёркивая, что в них используются поля снаружи.
29 ноя 19, 20:30    [22029226]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить