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

Откуда:
Сообщений: 42
Добрый день.

Помогите, пожалуйста, в написании запроса, в котором выполнялось бы копирование только новых строк (тех которых нет) из одной таблицы в другую (имеющую такую же структуру).

Уникальных полей или строк нет.
Данные могут повторяться.

Должна быть проверка на количество строк.
К примеру в исходной таблице 350 строк, а в ту в которую нужно скопировать данные - 300 строк.
Значит строки начиная с 301 по 350 должны скопироваться.

Если есть какой то пример - супер.

Спасибо.
22 дек 16, 14:09    [20036677]     Ответить | Цитировать Сообщить модератору
 Re: Дозагрузка таблицы только новыми строками данных  [new]
sergeimv
Member

Откуда: Россия, г.Казань
Сообщений: 42
insert into @dest
select * from @src
except
select * from @dest
22 дек 16, 14:35    [20036811]     Ответить | Цитировать Сообщить модератору
 Re: Дозагрузка таблицы только новыми строками данных  [new]
Pallich
Member

Откуда:
Сообщений: 42
sergeimv,
Спасибо.
Но не совсем вариант.
Таблицы громадные (по несколько млн строк).
Все таки целеобразнее это как то сделать с вычислением там и там кол-ва и строк, мне кажется, (чтоб весь массив не перебирался).
22 дек 16, 15:04    [20036960]     Ответить | Цитировать Сообщить модератору
 Re: Дозагрузка таблицы только новыми строками данных  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Тогда ваша задача при текущей структуре нерешаемая.
З.Ы. В таблице нет никаких номеров строк (пока она не отсортирована).
22 дек 16, 15:11    [20037020]     Ответить | Цитировать Сообщить модератору
 Re: Дозагрузка таблицы только новыми строками данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Pallich
Все таки целеобразнее это как то сделать с вычислением там и там кол-ва и строк, мне кажется, (чтоб весь массив не перебирался).
А, если первые 300 строк в обоих таблицах отличаются, нужно всё равно скопировать некий "остаток строк" из второй таблицы?

Не знаю, можно ли придумать надёжно работающий код для такого алгоритма...
Можно вычислить количество строк, потом пройти курсором, и вставлять начиная с 301-й
Можно выгрузить в файл, используя BCP, потом загрузить, начиная с 301-й
Можно попробовать код с ROW_NUMBER()
insert into @dest
select <тут перечислить все поля, кроме sort>
from (
    select *, row_number() over(order by null) as sort
    from @src
) s
where sort > 300
22 дек 16, 15:14    [20037030]     Ответить | Цитировать Сообщить модератору
 Re: Дозагрузка таблицы только новыми строками данных  [new]
Pallich
Member

Откуда:
Сообщений: 42
alexeyvg
Pallich
Все таки целеобразнее это как то сделать с вычислением там и там кол-ва и строк, мне кажется, (чтоб весь массив не перебирался).
А, если первые 300 строк в обоих таблицах отличаются, нужно всё равно скопировать некий "остаток строк" из второй таблицы?

[/src]


Ну они не будут отличаться.
По логике мы ж их типа ранее скопировали, а в исходной таблице данные не правятся.
22 дек 16, 15:22    [20037080]     Ответить | Цитировать Сообщить модератору
 Re: Дозагрузка таблицы только новыми строками данных  [new]
londinium
Member

Откуда: Киев
Сообщений: 1199
Pallich,
а можно в исходную таблицу добавить поле IsProcessed или вроде того?
22 дек 16, 15:24    [20037090]     Ответить | Цитировать Сообщить модератору
 Re: Дозагрузка таблицы только новыми строками данных  [new]
Pallich
Member

Откуда:
Сообщений: 42
londinium
Pallich,
а можно в исходную таблицу добавить поле IsProcessed или вроде того?


Нет.
Исходник, увы, править нельзя.
22 дек 16, 16:07    [20037339]     Ответить | Цитировать Сообщить модератору
 Re: Дозагрузка таблицы только новыми строками данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Pallich
Ну они не будут отличаться.
По логике мы ж их типа ранее скопировали, а в исходной таблице данные не правятся.
Не, так не бывает, поверьте :-)
Если нет механизма синхронизации, то будут отличаться.

Но вообще, собственно, вы же пишите, что записи не идентифицируются, так что понятие "отличаться" тут неприменимо, так что мой вопрос был некорректен.

То есть, если источник такой
idname
1Вася
1Вася
1Вася

А новая таблица такая
idname
1Петя
1Коля
1Маша
1Глаша

То мы должны добавить последнюю строку из второй таблицы, не смотря на содержимое, и получится
idname
1Вася
1Вася
1Вася
1Глаша
22 дек 16, 16:51    [20037646]     Ответить | Цитировать Сообщить модератору
 Re: Дозагрузка таблицы только новыми строками данных  [new]
Pallich
Member

Откуда:
Сообщений: 42
alexeyvg,

Не совсем так.

Источник такой (в нем всегда строк или столько же или больше чем в таблице получателе)
id name
1 Вася
1 Вася
1 Вася
1 Маша
1 Глаша

Таблица-получатель
id name
1 Вася
1 Вася

То есть мы должны добавить три строки из таблицы источника в таблицу получатель.
Три строки для бобавления:
1 Вася
1 Маша
1 Глаша
22 дек 16, 17:18    [20037808]     Ответить | Цитировать Сообщить модератору
 Re: Дозагрузка таблицы только новыми строками данных  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Pallich,

тогда только количественно сравнивать.
22 дек 16, 17:27    [20037873]     Ответить | Цитировать Сообщить модератору
 Re: Дозагрузка таблицы только новыми строками данных  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Pallich,

Т. к. идентифицировать конкретную строку в ваших таблицах невозможно, то задача не имеет корректного решения.
Можно изобразить что-то вроде этого:
with a as
(
 select
  Field1, Field2, ..., FieldN,
  row_number() over (order by (select 1)) as rn
 from
  Источник
)
insert into Получатель
 (Field1, Field2, ..., FieldN)
 select
  Field1, Field2, ..., FieldN
 from
  a
 where
  rn > (select count(*) from Получатель);
Но без всяких гарантий правильной работы.
22 дек 16, 17:27    [20037877]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить