Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите составить SQL запрос :)

Mr. Someone Мудрец (13651), закрыт 5 лет назад
Есть таблица Tablica.
В таблице Tablica есть поля Some_id, Pole1 и Pole2.
Мне нужно сделать вставку в эту таблицу, в которой есть поле Some_id и минимум еще 1 из остальных.
НО!
В этой вставке поле Some_id может уже существовать в таблице.
В таком случае нужно в этой записи изменить только остальные поля, которые есть во вставке.
Я вижу вариант проверки IF-ELSE/INSERT-UPDATE (правда, не знаю как это должно работать) и вариант JOIN (также в нем не силен).
Делаю это все на Laravel 5.8, но, если вы не знаете что это, то не беда, там пройдет и обычный SQL запрос.
В общем, мне нужен выход. Буду благодарен :)
Дополнен 5 лет назад
MySQL :)
Лучший ответ
Jurijus Zaksas Искусственный Интеллект (425063) 5 лет назад
В Оракле есть команда MERGE, которая делает именно то, что тебе нужно. Я ХЗ, какая там у тебя БД, но покопай мануалы - возможно, там тоже что-то такое есть.
Возможно, вот это: https ://dev.mysql. com/doc/refman/5.7/en/insert-on-duplicate.html
Mr. SomeoneМудрец (13651) 5 лет назад
MySQL. Сейчас посмотрю :)
Mr. SomeoneМудрец (13651) 5 лет назад
Я нашел такой пример:

MERGE Target AS T
USING Source AS S
ON T.ID = S.ID
WHEN MATCHED THEN
UPDATE SET T.NAME = S.NAME
WHEN NOT MATCHED BY TARGET THEN
INSERT (ID, NAME) VALUES(S.ID, S.NAME)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
Сейчас попытаюсь переделать под свой вариант. Как вместо этого Source подставить свою готовую таблицу?
Mr. SomeoneМудрец (13651) 5 лет назад
Вот, что у меня получилось:

MERGE Tablica AS T
USING {Kak tut vstavit? :)} AS S
ON T.Some_id = S.Some_id
WHEN MATCHED THEN
UPDATE SET T.Pole1 = S.Pole1,
T.Pole2 = S.Pole2
WHEN NOT MATCHED BY TARGET THEN
INSERT (Some_id, Pole1) VALUES(S.Some_id, S.Pole1)

Что скажете?
Остальные ответы
Похожие вопросы