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

Откуда:
Сообщений: 1197
Привет!

Нужно вставить в одну таблицу записи, которых нет в другой таблице.
Сравнение идет по 2 столбцам, а вставить надо данные из 3 столбцов.
Как?
15 июл 09, 09:40    [7416975]     Ответить | Цитировать Сообщить модератору
 Re: EXCEPT  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
relief
Нужно вставить в одну таблицу записи, которых нет в другой таблице.
В первую таблицу их надо вставить, во второй их нет
А где же они есть?
Откуда Вы их возьмете?
15 июл 09, 09:45    [7416994]     Ответить | Цитировать Сообщить модератору
 Re: EXCEPT  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Несмотря на кривоту формулировки вопроса, как и в старые времена, с помощью NOT EXISTS(). Ну, можно и с EXCEPT поизгаляться, сделав на основании его CTE, а потом по ключу вытащить нужные для вставки записи, но IMHO, это будет изврат.
15 июл 09, 09:47    [7417003]     Ответить | Цитировать Сообщить модератору
 Re: EXCEPT  [new]
relief
Member

Откуда:
Сообщений: 1197
Да. неверно написал. Нужно вставить в одну таблицу данные которых в ней нет, но есть в другой таблице.
че то я туплю. есть 2 столбца. CountryId и CityId. Как надо NOT IN написать?
15 июл 09, 10:10    [7417098]     Ответить | Цитировать Сообщить модератору
 Re: EXCEPT  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
relief
Как надо NOT IN написать?


Причем тут NOT IN, если надо NOT EXISTS()?!
15 июл 09, 10:13    [7417109]     Ответить | Цитировать Сообщить модератору
 Re: EXCEPT  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Если изредка такое надо, то делайте как сказал pkarklin

Также может быть полезным прочтение ТОП 10, вопрос 9

Если же такое следует проделывать часто, то рекомендую рассмотреть еще один вариант
В таблице, куда надо вставить данные, делаете констрейнт
relief
по 2 столбцам
с опцией IGNORE_DUP_KEY а дальше просто insert,
а сервер уж сам отбросит "те которые есть" и вставит только "те, которых нет"
15 июл 09, 10:21    [7417157]     Ответить | Цитировать Сообщить модератору
 Re: EXCEPT  [new]
sander1
Member

Откуда: Москва
Сообщений: 366
Паганель
Если же такое следует проделывать часто, то рекомендую рассмотреть еще один вариант


Простите что вмешиваюсь; вы рекомендуете вариант с "просто insert" для частого использования, не понятно почему, неужели он будет работать быстрее чем NOT EXISTS? Насколько я понимаю при такой вставке каждый раз будут обрабатываться все записи второй таблицы, или я не прав?
15 июл 09, 10:39    [7417259]     Ответить | Цитировать Сообщить модератору
 Re: EXCEPT  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Может, у меня недостаточно опыта, но я знаю только один случай, когда такое надо часто

Это когда периодически во временной таблице появляются "новые" данные,
которые надо "добавить" в постоянную таблицу

Тогда из "новых" данных обрабатывать (вносить в "основное хранилище") надо действительно все
А если приборов, могущих собрать одни и те же данные, несколько, то дубляж надо как-то ловить
И в этом случае констрейнт может оказаться предпочтительнее not exists
хотя бы по той причине, что констрейнт именно для таких целей предназначен

Например, мониторинг фактов телефонных вызовов
(там дубляж редок но возможен, каналы связи бывают сложны, это даже не сеть а паутина какая-то)
15 июл 09, 10:49    [7417324]     Ответить | Цитировать Сообщить модератору
 Re: EXCEPT  [new]
Ох...ий программизд
Guest
pkarklin
relief
Как надо NOT IN написать?


Причем тут NOT IN, если надо NOT EXISTS()?!


Ну если хочется человеку, то почему не NOT IN
declare @t1 table (f1 int, f2 int, f3 int)
declare @t2 table (f1 int, f2 int, f3 int)

insert @t1 values (1, 2, 3)
insert @t1 values (1, 4, 8)
insert @t1 values (2, 6, 5)
insert @t1 values (3, 1, 5)

insert @t2 values (1, 2, 3)
insert @t2 values (17, 4, 8)
insert @t2 values (2, 6, 5)
insert @t2 values (52, 78, 8)
insert @t2 values (3, 30, 5)

select * from @t1
select * from @t2

insert @t1 (f1, f2, f3)
select f1, f2, f3
from @t2
where f1 not in (select f1 from @t1)
or f2 not in (select f2 from @t1)
15 июл 09, 11:08    [7417448]     Ответить | Цитировать Сообщить модератору
 Re: EXCEPT  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> where f1 not in (select f1 from @t1)
> or f2 not in (select f2 from @t1)

insert @t2 values (2, 4, 888)


Posted via ActualForum NNTP Server 1.4

15 июл 09, 11:15    [7417495]     Ответить | Цитировать Сообщить модератору
 Re: EXCEPT  [new]
Ох...ий программизд
Guest
daw

insert @t2 values (2, 4, 888)


погорячился... :o)
15 июл 09, 11:33    [7417644]     Ответить | Цитировать Сообщить модератору
 Re: EXCEPT  [new]
dima.dp.ua
Member

Откуда:
Сообщений: 42
insert @t1 (f1, f2, f3)
select f1, f2, f3 from @t2
EXCEPT
select f1, f2, f3 from @t1
15 июл 09, 15:33    [7419510]     Ответить | Цитировать Сообщить модератору
 Re: EXCEPT  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
dima.dp.ua
select f1, f2, f3 from @t2
EXCEPT
select f1, f2, f3 from @t1
relief
Сравнение идет по 2 столбцам, а вставить надо данные из 3 столбцов.
15 июл 09, 15:35    [7419520]     Ответить | Цитировать Сообщить модератору
 Re: EXCEPT  [new]
dima.dp.ua
Member

Откуда:
Сообщений: 42
а нет, недочитал услови что сравнение только по двум столбцам.
15 июл 09, 15:47    [7419602]     Ответить | Цитировать Сообщить модератору
 Re: EXCEPT  [new]
dima.dp.ua
Member

Откуда:
Сообщений: 42
Тогда так
select  t2.f1, t2.f2, t2.f3 from @t2 t2
join (select f1, f2 from @t2 except select f1, f2 from @t1) t1
on t1.f1 = t2.f1
and t1.f1 = t2.f1
15 июл 09, 16:04    [7419721]     Ответить | Цитировать Сообщить модератору
 Re: EXCEPT  [new]
dima.dp.ua
Member

Откуда:
Сообщений: 42
Инресно почему на форуме нет правки? Последняя строка конечно же
and t1.f2 = t2.f2
15 июл 09, 16:06    [7419739]     Ответить | Цитировать Сообщить модератору
 Re: EXCEPT  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
потому что правки задним числом всегда приносят неактуальный результат.

для спящего время бодрствования равносильно сну
15 июл 09, 16:08    [7419754]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить