Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Синхронизация таблиц (число прочтений - 5723 )
kriblya
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 313
Зарегистрирован: 24. Декабря 2007
Re: Синхронизация таблиц
Ответ #15 - 08. Апреля 2009 :: 12:01
Печать  

INSERT INTO Б VALUES (список колонок)
ON DUPLICATE KEY UPDATE new=0,...
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Синхронизация таблиц
Ответ #16 - 08. Апреля 2009 :: 13:02
Печать  
Это мы в курсе... Мне бы для MSSQL такой ход.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Синхронизация таблиц
Ответ #17 - 08. Апреля 2009 :: 15:58
Печать  
Условие где?

Можно тупенько

Dest.ID+Dest.ParentID IN (SELECT ID+ParentID FROM ArticleGroup1S (NoLock))
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Синхронизация таблиц
Ответ #18 - 09. Апреля 2009 :: 06:21
Печать  
Решил задачу вот так. Посмотрите, все ли правильно, может чего не хвататет, а может что и лишнее:

Код
Выбрать все
DECLARE
  @ID			numeric(5),
  @ArticleID	numeric(6),
  @Barcode		varchar(30),
  @Size			numeric(15,3),
  @isDel		bit

DECLARE i_Barcode_cursor INSENSITIVE CURSOR
  FOR SELECT * FROM i_Barcode
OPEN i_Barcode_cursor
FETCH NEXT FROM i_Barcode_cursor
  INTO @ID,@ArticleID,@Barcode,@Size,@isDel
WHILE @@FETCH_STATUS = 0
BEGIN
  IF EXISTS (SELECT * FROM Barcode WHERE ID = @ID AND ArticleID = @ArticleID)
    UPDATE Barcode SET Barcode = @Barcode, Size = @Size, isDel = @isDel, isNew = 1, isUpdate = 0 WHERE ID = @ID AND ArticleID = @ArticleID
  ELSE
    INSERT Barcode VALUES (@ID,@ArticleID,@Barcode,@Size,@isDel,1,0)
  FETCH NEXT FROM i_Barcode_cursor
    INTO @ID,@ArticleID,@Barcode,@Size,@isDel
END
CLOSE i_Barcode_cursor
DEALLOCATE i_Barcode_cursor
GO 

  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Синхронизация таблиц
Ответ #19 - 09. Апреля 2009 :: 06:28
Печать  
Курсор здесь лишний.  Улыбка А так всё правильно.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Синхронизация таблиц
Ответ #20 - 09. Апреля 2009 :: 06:38
Печать  
А как без курсора?  Круглые глаза

Ну в смысле, как без курсора понятно, Вадимко привел решение. Я имею в виду как без курсора в моем решении?
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Синхронизация таблиц
Ответ #21 - 09. Апреля 2009 :: 07:14
Печать  
sadovnikov же писал ещё в #1

Код
Выбрать все
UPDATE Barcode
SET Barcode = i_Barcode.Barcode
	, Size = i_Barcode.Size
	, isDel = i_Barcode.isDel
	, isNew = 1, isUpdate = 0
FROM Barcode
	INNER JOIN i_Barcode ON Barcode.ID = i_Barcode.ID
		AND Barcode.ArticleID = i_Barcode.ArticleID

INSERT Barcode
SELECT i_Barcode.ID
	, i_Barcode.ArticleID
	, i_Barcode.Barcode
	, i_Barcode.Size
	, i_Barcode.isDel
	, 1, 0
FROM i_Barcode
WHERE NOT Exists(
		SELECT *
		FROM Barcode
		WHERE Barcode.ID = i_Barcode.ID
			AND Barcode.ArticleID = i_Barcode.ArticleID) 

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Синхронизация таблиц
Ответ #22 - 09. Апреля 2009 :: 10:09
Печать  
Действительно...

По поводу решения в #1, я его и использовал. Но вот меня смутило применение WHERE ID IN (Select ID From А),  что то не допер я, что условие в join надо вынести Круглые глаза

з.ы. Сравнил статистику обоих запросов. С курсорами оказывает фигня получается.

                                               Курсор             berezdetsky
Время выполнения клиента      12:25:11            12:24:42            
Статистика по профилю запроса                              
 Количество инструкций INSERT, DELETE и UPDATE      1408            2            705.0000
 Строки, изменяемые инструкциями INSERT, DELETE и UPDATE      1408            1408            1408.0000
 Количество инструкций SELECT      1410            0            705.0000
 Строк, возвращенных инструкциями SELECT      1408            0            704.0000
 Количество транзакций      1408            2            705.0000
Сетевая статистика                              
 Количество циклов обращения к серверу      1            1            1.0000
 TDS-пакетов отправлено клиентом      1            1            1.0000
 TDS-пакетов получено с сервера      19            1            10.0000
 байтов отправлено клиентом      1656            1054            1355.0000
 байтов получено с сервера      76238            41            38139.5000
Статистика по времени                              
 Время обработки клиента      1933            0            966.5000
 Общее время выполнения      2042            218            1130.0000
 Время ожидания при ответе сервера      109            218            163.5000
  
Наверх
 
IP записан
 
kriblya
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 313
Зарегистрирован: 24. Декабря 2007
Re: Синхронизация таблиц
Ответ #23 - 14. Апреля 2009 :: 08:22
Печать  
zenik писал(а) 08. Апреля 2009 :: 13:02:
Это мы в курсе... Мне бы для MSSQL такой ход.

а что в мсскл нет такой конструкции??? (правда не знаю), она помоему из скл92 еще
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Синхронизация таблиц
Ответ #24 - 15. Апреля 2009 :: 08:41
Печать  
Это только в MYSQL, ну может еще где есть. А вот в MSSQL такого нема Печаль Самому не хватает конструкции:
Код
Выбрать все
REPLACE INTO summ (id,date,summa) VALUES ($id,$date,$value) 


Вставка замена по ключу в MYSQL...
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Синхронизация таблиц
Ответ #25 - 15. Апреля 2009 :: 08:46
Печать  
zenik писал(а) 15. Апреля 2009 :: 08:41:
Это только в MYSQL, ну может еще где есть. А вот в MSSQL такого нема Печаль Самому не хватает конструкции:
Код
Выбрать все
REPLACE INTO summ (id,date,summa) VALUES ($id,$date,$value) 


Вставка замена по ключу в MYSQL...

появилось в ms sql 2008  команда  merge
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать