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


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Синхронизация таблиц
09. Апреля 2008 :: 09:36
Печать  
Ничего умнее для названия не придумал, на самом деле возможно все не так сложно. Имеем две таблицы А и Б, структура почти идентичная (для простоты: Таблица А - одно поле ID, Таблица Б - два поля: ID и New). Задача: ПЕРЕНЕСТИ записи из таблицы А в таблицу Б. Правило: Если ID есть, то просто (UPDATE) признак New =1, если записи нет, то добавить (INSERT) и new = 1.
Если честно, то даже не представляю как такое сделать.
К примеру: Талица Б
100001 0
100002 0
100003 0
Таблица А
100003
100004
После "синхронизации" Таблица А - пустая, таблица Б:
100001 0
100002 0
100003 1
100004 1
В принципе, можно в таблицу А добавить поле new и заполнять его единицей, это не критично. Но не ясен сам процесс такого обновления если есть или нет.
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Синхронизация таблиц
Ответ #1 - 09. Апреля 2008 :: 10:01
Печать  
Update Б
Set New = 1
Where
 ID IN (Select ID From А)

Insert Into Б
(ID, NEW)
Select
 ID, 1
From А
Where
 ID NOT IN (Select ID From Б)

Delete From A
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Синхронизация таблиц
Ответ #2 - 09. Апреля 2008 :: 10:09
Печать  
О! Спасибо... Как говориться умом понимаю, математически выразить не могу (с) Анекдот...
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Синхронизация таблиц
Ответ #3 - 09. Апреля 2008 :: 10:39
Печать  
Тэкс... А если усложнить? С одним обновляемым полем я понял, а как обновить остальные поля (к примеру DESCR), замещая данные из таблицы А?. Допустим:
Таблица Б
100001 "мама" 0
100002 "мыла" 0
100003 "раму" 0
Таблица А
100002 "рыла"
100003 "глубокую"
100004 "канаву"
После "синхронизации" Таблица А - пустая, таблица Б:
100001 "мама" 0
100002 "рыла" 1
100003 "глубокую" 1
100004 "канаву" 1
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Синхронизация таблиц
Ответ #4 - 09. Апреля 2008 :: 10:46
Печать  
zenik писал(а) 09. Апреля 2008 :: 10:39:
...а как обновить остальные поля (к примеру DESCR), замещая данные из таблицы А?. 


Update Б
Set
  Колонка1 = <Значение>,
  Колонка2 = <Значение>,
  ...
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Синхронизация таблиц
Ответ #5 - 09. Апреля 2008 :: 11:52
Печать  
т.е. должно выглядеть как то так или можно проще?

     |UPDATE ArticleGroup
     |      SET
     |            NEW = 1,

     |          DESCR = (SELECT DESCR FROM ArticleGroup1S WHERE ID IN (SELECT ID FROM ArticleGroup1S))
Вот эта строка меня очень сильно смущает... Слишком громоздко...
     |WHERE
     |      ID IN (SELECT ID FROM ArticleGroup1S)
     |INSERT INTO ArticleGroup
     |      (ID,ParentID,Level,Descr,isDel,New)
     |SELECT ID,ParentID,Level,Descr,isDel,1
     |FROM ArticleGroup1S
     |WHERE ID NOT IN (SELECT ID FROM ArticleGroup)
     |DELETE FROM ArticleGroup1S
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Синхронизация таблиц
Ответ #6 - 09. Апреля 2008 :: 12:06
Печать  
Если все-таки заглянуть в BOL, то сможем увидеть так вот такой пример:

Код
Выбрать все
UPDATE titles
   SET ytd_sales = titles.ytd_sales + sales.qty
	FROM titles, sales
	   WHERE titles.title_id = sales.title_id
	   AND sales.ord_date = (SELECT MAX(sales.ord_date) FROM sales)


 

  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Синхронизация таблиц
Ответ #7 - 09. Апреля 2008 :: 12:43
Печать  
Спасиб. Работает. Но все же хотелось бы узнать правильно или нет?

UPDATE ArticleGroup
SET
     NEW            = 1
     ,ParentID      =ArticleGroup1S.ParentID
     ,Level            =ArticleGroup1S.Level
     ,Descr            =ArticleGroup1S.Descr
     ,isDel            =ArticleGroup1S.isDel
FROM ArticleGroup,ArticleGroup1S WHERE ArticleGroup.ID IN (SELECT ID FROM ArticleGroup1S)
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Синхронизация таблиц
Ответ #8 - 09. Апреля 2008 :: 13:15
Печать  
Правильно. Единственно, я бы

FROM ArticleGroup,ArticleGroup1S

переписал на человеческое связывание...
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Синхронизация таблиц
Ответ #9 - 09. Апреля 2008 :: 13:39
Печать  
Оно?
UPDATE ArticleGroup
SET
     NEW            = 1
     ,ParentID      =Source.ParentID
     ,Level            =Source.Level
     ,Descr            =Source.Descr
     ,isDel            =Source.isDel
FROM ArticleGroup AS Dest
INNER JOIN
     ArticleGroup1S AS Source ON Source.ID=Dest.ID
     AND Dest.ID IN (SELECT ID FROM ArticleGroup1S)
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Синхронизация таблиц
Ответ #10 - 09. Апреля 2008 :: 13:54
Печать  
Почти Улыбка

UPDATE ArticleGroup 
SET 
     NEW            = 1
     ,ParentID      =Source.ParentID
     ,Level            =Source.Level
     ,Descr            =Source.Descr
     ,isDel            =Source.isDel
FROM ArticleGroup AS Dest (NoLock)
LEFT JOIN
     ArticleGroup1S AS Source (NoLock) ON Source.ID=Dest.ID 
WHERE
     Dest.ID IN (SELECT ID FROM ArticleGroup1S (NoLock))
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Синхронизация таблиц
Ответ #11 - 09. Апреля 2008 :: 14:25
Печать  
noLock там врядли понадобится. Этими таблицами будет пользоваться только эта обработка... Можно сказать будет монопольно трудиться, так что нет смысла.

Еще раз спасибо.

p.s. По поводу LEFT тоже не актуально, ID то уникальный... (или я не прав?)
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Синхронизация таблиц
Ответ #12 - 10. Апреля 2008 :: 03:51
Печать  
zenik писал(а) 09. Апреля 2008 :: 14:25:
noLock там врядли понадобится. Этими таблицами будет пользоваться только эта обработка... Можно сказать будет монопольно трудиться, так что нет смысла.


Тогда тем более стоит поставить NoLock. Чтобы скуль не тратил ресурсов на блокирование таблиц.

zenik писал(а) 09. Апреля 2008 :: 14:25:
p.s. По поводу LEFT тоже не актуально, ID то уникальный... (или я не прав?)


Просто, с LEFT JOIN скуль чаще всего строит более кроасивый план запроса , чем с INNER JOIN.
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Синхронизация таблиц
Ответ #13 - 10. Апреля 2008 :: 04:53
Печать  
Учту. Спасибо.
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Синхронизация таблиц
Ответ #14 - 08. Апреля 2009 :: 10:32
Печать  
О как время быстро летит... Уже год прошел  Класс.

Подскажите еще плз. Как усовершенствовать запрос и сделать условие по 2-м ключам - ID и ParentID?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать