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

Откуда:
Сообщений: 1906
Почитал, что можно использовать join вместе с операциями update/delete.

Что-то понятных примеров не нагуглить. не подскажете?
21 сен 16, 11:42    [19690958]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
TaPaK
Member

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

https://www.google.com.ua/search?espv=2&q=update join&oq=update join&gs_l=serp.3..0i67k1j0l9.890.1353.0.1478.2.2.0.0.0.0.110.204.1j1.2.0....0...1.1.64.serp..0.2.203.r-ayBCb74rs
21 сен 16, 11:45    [19690990]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
questioner
Member

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

это я уже видел
21 сен 16, 11:49    [19691036]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
TaPaK
Member

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

ну больше гугла сюда мы вряд ли напихаем, вот ещё , варианты,
https://www.simple-talk.com/sql/learn-sql-server/update-basics-in-sql-server/
или за вас в слух прочитать?
21 сен 16, 11:51    [19691063]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
DECLARE @T TABLE(ID INT);
DECLARE @F TABLE(ID INT,IDT INT);
INSERT @T(ID)VALUES(1),(2),(3);
INSERT @F(ID,IDT)VALUES(1,1),(2,2);

DELETE T FROM @T T JOIN @F F ON T.ID=F.IDT;

SELECT * FROM @T;
А?
21 сен 16, 11:56    [19691104]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
questioner
Member

Откуда:
Сообщений: 1906
автор
update Student s
inner join Student_Group s_g on s_g.stud_id = s.id
inner join Group g on g.group_id = g.id
where g.id = 3
SET name = 'new_name'


Вот что тут не так?

хочу изменить имя студентам из определенной группы.

группа и студент связаны связью многие ко многим.

management студия показывает кучу синтаксических ошибок
21 сен 16, 12:14    [19691246]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
TaPaK
Member

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

такой запрос у меня тоже не проходит
хочу изменить имя студентам из определенной группы.
группа и студент связаны связью многие ко многим.
21 сен 16, 12:15    [19691252]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
questioner,

update s from Student s join...
21 сен 16, 12:16    [19691266]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
questioner,

Хотя не, наврал.

update s set ... from Student s join ... where ... 
21 сен 16, 12:18    [19691295]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
questioner
Member

Откуда:
Сообщений: 1906
Pavel1211
questioner,

Хотя не, наврал.

update s set ... from Student s join ... where ... 


автор
update s
SET name = 'new_name'
from dbo.Student s
inner join dbo.Student_Group s_g on s_g.stud_id = s.id
inner join dbo.Group g on g.group_id = g.id
where g.id = 3


ssms
Incorrect syntax near the keyword 'Group'.
21 сен 16, 12:23    [19691334]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
xenix
Guest
questioner,

inner join dbo.[Group]
21 сен 16, 12:27    [19691354]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
questioner,
читаем
https://msdn.microsoft.com/en-us/library/ms177523.aspx

GROUP BY только в подзапрос можно
21 сен 16, 12:27    [19691355]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
TaPaK
Member

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

омг :)
21 сен 16, 12:28    [19691366]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
iap
Member

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

в квадратные скобки поместить ключевое слово GROUP не судьба?

Однако, надо добиться, чтобы каждая запись dbo.Student апдейтилась один раз.
А не размножалась благодаря кривым JOINам
21 сен 16, 12:29    [19691375]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
questioner
Member

Откуда:
Сообщений: 1906
xenix
questioner,

inner join dbo.[Group]


спасибо
21 сен 16, 13:30    [19691976]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
questioner
Member

Откуда:
Сообщений: 1906
iap
questioner,

Однако, надо добиться, чтобы каждая запись dbo.Student апдейтилась один раз.
А не размножалась благодаря кривым JOINам


Я понимаю, что если студент больше, чем в одной группе, то будут дупликаты.

Почему надо добиться того, чтобы дупликатов не было?
21 сен 16, 13:53    [19692161]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
questioner
iap
questioner,

Однако, надо добиться, чтобы каждая запись dbo.Student апдейтилась один раз.
А не размножалась благодаря кривым JOINам


Я понимаю, что если студент больше, чем в одной группе, то будут дупликаты.

Почему надо добиться того, чтобы дупликатов не было?
Если в каждой строке апдейтится на одно и то же значение, то это ещё ничего.
Но если значения разные (например, берутся из записи в таблице групп), то результат будет непредсказуем.
Об этом можно прочитать в справке по команде UPDATE.
21 сен 16, 14:08    [19692281]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1558
questioner,

автор
inner join dbo.Group g on g.group_id = g.id

так и задумывалось?
21 сен 16, 14:21    [19692356]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
questioner
Member

Откуда:
Сообщений: 1906
Zelius
questioner,

автор
inner join dbo.Group g on g.group_id = g.id

так и задумывалось?


Косяк
21 сен 16, 15:30    [19692729]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
questioner
Member

Откуда:
Сообщений: 1906
iap
questioner
пропущено...


Я понимаю, что если студент больше, чем в одной группе, то будут дупликаты.

Почему надо добиться того, чтобы дупликатов не было?
Если в каждой строке апдейтится на одно и то же значение, то это ещё ничего.
Но если значения разные (например, берутся из записи в таблице групп), то результат будет непредсказуем.
Об этом можно прочитать в справке по команде UPDATE.


update s
SET name = CONCAT('student_from_',g.name)
from dbo.Student s
inner join dbo.Student_Group s_g on s_g.stud_id = s.id
inner join dbo.[Group] g on s_g.group_id = g.id
where g.id = 3


Вроде нормально всегда отрабатывает
21 сен 16, 15:33    [19692747]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
iljy
Member

Откуда:
Сообщений: 8711
questioner
Вроде нормально всегда отрабатывает


Люблю теоретиков, погибших правды ради, ибо их есть.
Слова "вроде" и "всегда" плохо сочетаются в одной фразе. Даже в документации написано

MSDN
The results of an UPDATE statement are undefined if the statement includes a FROM clause that is not specified in such a way that only one value is available for each column occurrence that is updated, that is if the UPDATE statement is not deterministic.

, и пример есть.
21 сен 16, 18:50    [19693697]     Ответить | Цитировать Сообщить модератору
 Re: join with update/delete  [new]
questioner
Member

Откуда:
Сообщений: 1906
iljy
questioner
Вроде нормально всегда отрабатывает


Люблю теоретиков, погибших правды ради, ибо их есть.
Слова "вроде" и "всегда" плохо сочетаются в одной фразе. Даже в документации написано

MSDN
The results of an UPDATE statement are undefined if the statement includes a FROM clause that is not specified in such a way that only one value is available for each column occurrence that is updated, that is if the UPDATE statement is not deterministic.

, и пример есть.


пожалуй оставлю этот тут, чтоб если кто читать будет по ссылкам не лазил.

CREATE TABLE dbo.Table1 
    (ColA int NOT NULL, ColB decimal(10,3) NOT NULL);
GO
CREATE TABLE dbo.Table2 
    (ColA int PRIMARY KEY NOT NULL, ColB decimal(10,3) NOT NULL);
GO
INSERT INTO dbo.Table1 VALUES(1, 10.0), (1, 20.0);
INSERT INTO dbo.Table2 VALUES(1, 0.0);
GO
UPDATE dbo.Table2 
SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB
FROM dbo.Table2 
    INNER JOIN dbo.Table1 
    ON (dbo.Table2.ColA = dbo.Table1.ColA);
GO
SELECT ColA, ColB 
FROM dbo.Table2;
22 сен 16, 11:28    [19695590]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить