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

Откуда: Kyiv
Сообщений: 426
Доброго всем времени суток!
Моя проблем касается и MySQL и MS SQL, но всё-таки решил уточнить её здесь.
Задача: со стороны MS SQL сервера обновить данные в таблице MySQL. Но UPDATE должен быть с соединением таблиц.

Я написал такой UPDATE:

	UPDATE OPENQUERY (MYSQL_REMOTE,' select kid, contragent, count_st, count_nst, saldo, manager, course from kontragents ') 
	SET course = @CurrRate 
	, saldo = db.Дебет
	FROM OPENQUERY (MYSQL_REMOTE,' select kid, contragent, count_st, count_nst, saldo, manager, course from kontragents ')  rem_k
	LEFT OUTER JOIN 
									(
										Select [Тип], [Контрагент], [Дебет Начало], [Кредит Начало], [Дебет], [Кредит], [Дебет Конец], [Кредит Конец], [Менеджер] 
										From dbo.отчетДебиторка (@DateBegin,@DateEnd,0)
										WHERE not ([Дебет Начало]=0 AND [Кредит Начало]=0 AND [Дебет]=0 AND [Кредит]=0 AND [Дебет Конец]=0 
										AND [Кредит Конец]=0)
									) db ON  rem_k.contragent = db.[Контрагент] 


После его выполнения, в целевой таблице на стороне MySQL - у всех записей поле saldo обновилось значением первой строки результата запроса, который я использую для UPDATE.

Если я пробую вывести результат на стороне MS SQL запросом, который используется в UPDATE - то значения получаются те , что надо.
	SELECT rem_k.contragent
	, db.Дебет
	FROM OPENQUERY (MYSQL_REMOTE,' select kid, contragent, count_st, count_nst, saldo, manager, course from kontragents ')  rem_k
	LEFT OUTER JOIN 
									(
										Select [Тип], [Контрагент], [Дебет Начало], [Кредит Начало], [Дебет], [Кредит], [Дебет Конец], [Кредит Конец], [Менеджер] 
										From dbo.отчетДебиторка (@DateBegin,@DateEnd,0)
										WHERE not ([Дебет Начало]=0 AND [Кредит Начало]=0 AND [Дебет]=0 AND [Кредит]=0 AND [Дебет Конец]=0 
										AND [Кредит Конец]=0)
									) db ON  rem_k.contragent = db.[Контрагент] 


Вопрос: что я делаю не так? MySQL вообще

К сообщению приложен файл. Размер - 31Kb
10 ноя 17, 17:19    [20944442]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE в БД MySQL из MS SQL (через Linked Server)  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 426
вот результат на стороне MS SQL:

К сообщению приложен файл. Размер - 27Kb
10 ноя 17, 17:21    [20944447]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE в БД MySQL из MS SQL (через Linked Server)  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 426
Romka-Fes,

"MySQL вообще" - опечатался, имелось в виду "MySQL вообще понимает такие UPDATE?"
10 ноя 17, 17:23    [20944458]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE в БД MySQL из MS SQL (через Linked Server)  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 426
Версия MySQL: 5.6.27-75.0-log
10 ноя 17, 17:24    [20944461]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE в БД MySQL из MS SQL (через Linked Server)  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 426
Пока выкрутился путём записи новых данных в временную таблицу и UPDATE на стороне MySQL через JOIN с ней:

update kontragents AS k INNER JOIN tmp_kontragents t ON k.kid = t.kid SET k.saldo = t.saldo, k.manager = t.manager


Но проблема таки имеет место быть. То-ли это MySQL ODBC драйвер такое вытворяет, то ли сам MySQL. Вот в чём вопрос....
11 ноя 17, 09:47    [20945359]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE в БД MySQL из MS SQL (через Linked Server)  [new]
miksoft
Member

Откуда:
Сообщений: 36368
Romka-Fes,

А почему внешнее соединение? Т.е. почему LEFT OUTER JOIN, а не просто JOIN ?
11 ноя 17, 12:32    [20945530]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE в БД MySQL из MS SQL (через Linked Server)  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 426
miksoft,

потому что не по каждому контрагенту может быть соответствующая запись из таблицы, с которой я делаю соединение. На скрине выше видно много NULL в поле [Дебет]. Если я сделаю JOIN - то в результате будут только те контрагенты, у которых есть деб. задолженность. А это совсем не то, что мне нужно.
12 ноя 17, 09:26    [20946526]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE в БД MySQL из MS SQL (через Linked Server)  [new]
miksoft
Member

Откуда:
Сообщений: 36368
Romka-Fes
много NULL в поле [Дебет]
Ну если вас устраивает, что в поле saldo будет записан NULL, то пусть так.

Попробуйте как-то так:
UPDATE OPENQUERY (MYSQL_REMOTE,' select kid, contragent, count_st, count_nst, saldo, manager, course from kontragents ') rem_k 
	LEFT OUTER JOIN 
									(
										Select [Тип], [Контрагент], [Дебет Начало], [Кредит Начало], [Дебет], [Кредит], [Дебет Конец], [Кредит Конец], [Менеджер] 
										From dbo.отчетДебиторка (@DateBegin,@DateEnd,0)
										WHERE not ([Дебет Начало]=0 AND [Кредит Начало]=0 AND [Дебет]=0 AND [Кредит]=0 AND [Дебет Конец]=0 
										AND [Кредит Конец]=0)
									) db ON  rem_k.contragent = db.[Контрагент]
	SET rem_k.course = @CurrRate 
	, rem_k.saldo = db.Дебет
Я не знаю синтаксис MS SQL, писал по аналогии из документации по MySQL.
12 ноя 17, 15:35    [20946958]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE в БД MySQL из MS SQL (через Linked Server)  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 426
miksoft,

Для MS SQL Server это некорректный синтаксис.
Именно такой update я делаю на самом MySQL, предварительно записав нудные для обновления данные во временную таблицу.
13 ноя 17, 10:36    [20948245]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить