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

Откуда:
Сообщений: 334
Есть рабочая таблица с такой структурой:
create table [t_Tables](
   [id] [int] identity(1,1) not null,
   [db_id] [int] not null,
   [name] [varchar](255)
) on [primary]

Есть таблица обновлений t_TablesNew с такой же структурой.

Далее необходимо выполнить синхронизацию таблиц:
1. Из таблицы t_TablesNew скопировать все записи, которых нет в t_Table (критерий отбора - [db_id] + [name]
2. Из таблицы t_Tables удалить те, которых нет в t_TablesNew.

Думал, что скрипт должен быть типа:
select [db_id],[name] from [t_TablesNew] where ??????? not in (select [db_id],[name] from [t_Tables])


Помогите плиз.
17 июл 13, 12:27    [14577357]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
Yasha123
Member

Откуда:
Сообщений: 1957
except ?

The following query returns any distinct values from the query to the left of the EXCEPT operand that are not also found on the right query.
USE AdventureWorks2008R2;
GO
SELECT ProductID 
FROM Production.Product
EXCEPT
SELECT ProductID 
FROM Production.WorkOrder ;
17 июл 13, 12:33    [14577401]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
INSERT [t_Tables]([db_id],[name])
select [db_id],[name] from [t_TablesNew] 
EXCEPT
select [db_id],[name] from [t_Tables]
17 июл 13, 12:47    [14577500]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
Гость333
Member

Откуда:
Сообщений: 3683
=Сергей=,

Какая версия сервера? Если 2008 и выше, используйте команду MERGE.
17 июл 13, 12:50    [14577521]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
MERGE
17 июл 13, 12:51    [14577533]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2395
Гость333
=Сергей=,

Какая версия сервера? Если 2008 и выше, используйте команду MERGE.



если ниже то "NOT exists"
17 июл 13, 13:20    [14577780]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гость333
=Сергей=,

Какая версия сервера? Если 2008 и выше, используйте команду MERGE.

Вот даже пример вам сделал :)
+ Пример для ваших таблиц
create table #t_Tables(
   [id] [int] identity(1,1) not null,
   [db_id] [int] not null,
   [name] [varchar](255)
);

create table #t_TablesNew(
   [id] [int] identity(1,1) not null,
   [db_id] [int] not null,
   [name] [varchar](255)
);

insert #t_Tables (db_id, name)
select 1, 'master' union all
select 2, 'tempdb' union all
select 3, 'model' union all
select 4, 'msdb';

insert #t_TablesNew (db_id, name)
select 1, 'master' union all
select 2, 'tempdb' union all
select 4, 'msdb' union all
select 5, 'AdventureWorks';

select * from #t_Tables;

merge #t_Tables as t
using #t_TablesNew as s
on s.db_id = t.db_id and s.name = t.name
when not matched by target
then insert (db_id, name) values (s.db_id, s.name)
when not matched by source
then delete;

select * from #t_Tables;

drop table #t_Tables, #t_TablesNew;
17 июл 13, 13:34    [14577876]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
Гость333
=Сергей=,

Какая версия сервера? Если 2008 и выше, используйте команду MERGE.


Не пойдёт, 2005.

А как удалить из t_Tables тех записей которых нет в t_TablesNew (критерий [db_id] + [name])?
17 июл 13, 13:37    [14577897]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
Гость333
Member

Откуда:
Сообщений: 3683
=Сергей=
А как удалить из t_Tables тех записей которых нет в t_TablesNew (критерий [db_id] + [name])?

DELETE t
FROM t_Tables t
WHERE NOT EXISTS(SELECT * FROM t_TablesNew n WHERE n.db_id = t.db_id AND n.name = t.name)
17 июл 13, 13:40    [14577912]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гость333
=Сергей=
А как удалить из t_Tables тех записей которых нет в t_TablesNew (критерий [db_id] + [name])?

DELETE t
FROM t_Tables t
WHERE NOT EXISTS(SELECT * FROM t_TablesNew n WHERE n.db_id = t.db_id AND n.name = t.name)

Заметил, что поле name в вашей таблице допускает значения NULL. Такие значения могут встречаться? Как они должны обрабатываться?
17 июл 13, 13:41    [14577919]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
Гость333
Заметил, что поле name в вашей таблице допускает значения NULL. Такие значения могут встречаться? Как они должны обрабатываться?

Исправлю, недоглядел, спасибо за помощь!
17 июл 13, 13:46    [14577953]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
=Сергей=,

Если есть две одинаковые таблицы
create table [t_Table_Global](
   [id] [int] identity(1,1) not null,
   [name] [varchar](255),
   [last_activity] [datetime]
) 
create table [t_Table_Local](
   [id] [int] identity(1,1) not null,
   [name] [varchar](255),
   [last_activity] [datetime]
) 

и нужно обновить поле [t_Table_Global].[last_activity], взяв его из [t_Table_Local].[last_activity] с соответствующим [name], и при условии, что у [t_Table_Local].[last_activity] дата свежее.
Помогите, плиз.
1 сен 13, 19:56    [14781421]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
o-o
Guest
ну а если в таблице t_Table_Global для данного name 10 различных записей, и у всех даты "свежее", чем в таблице t_Table_Local?
1 сен 13, 20:12    [14781473]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить