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

Откуда: Екатеринбург
Сообщений: 75
Добрый день форумчане На работе поставили задачу перевести рабочую БД на новую версию - в новой БД изменена немного структура, добавлены поля и т.д.

Встал конкретный вопрос: перенос данных из старой БД в новую, и вроде бы все хорошо, select-insert работает, но проблема: есть таблица ОКАТО, мне нужно добавить в неё данные из старой базы ОКАТО, и они частично дублируются, тоесть нужно сделать select все кроме тех что совпадают

Гугл подсказал что функции IGORE в MSSQL нет, людя говорят про EXISTS, но у меня почему то оно не работет - гуглил , читал , не смог понять, помогоите разобраться, это первая база, всего их три, так что хочу в будущем не наступать на те же грабли:

рабочий запрос - выводит только записи которые совпадают, вроде логично:

select * from New.dbo.Voc_region, GMSN_Kurgan.dbo.Voc_region 
WHERE New.dbo.Voc_region.Code_region = GMSN_Kurgan.dbo.Voc_region.Code_region 


Далее , мне нужно указать чтоб выводил о все кроме этих записей и потом добавить INSERT
(да я читал что медленно и не комильфо, но это нужно сделать один раз, и время обработки не принципиально)

/*insert into New.dbo.Voc_region*/
select * from GMSN_Kurgan.dbo.Voc_region
WHERE  NOT EXISTS (select * from  New.dbo.Voc_region,GMSN_Kurgan.dbo.Voc_region 
WHERE New.dbo.Voc_region.Code_region = GMSN_Kurgan.dbo.Voc_region.Code_region )

На выходе получаю 0, никак не могу понять - где ошибка ??
9 июл 14, 10:57    [16279634]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос профессионалам по EXISTS  [new]
sqluserfromhell
Member

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

left join или except в помощь
9 июл 14, 11:01    [16279665]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос профессионалам по EXISTS  [new]
Glory
Member

Откуда:
Сообщений: 104760
select * from GMSN_Kurgan.dbo.Voc_region a
WHERE NOT EXISTS (select * from New.dbo.Voc_region b
WHERE b.Code_region = a.Code_region )
9 июл 14, 11:06    [16279689]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос профессионалам по EXISTS  [new]
JesterOK
Member

Откуда: Екатеринбург
Сообщений: 75
Glory,
Упростил запрос в теме поставив *, с указаниями конкретных полей не работает

select GMSN_Kurgan.dbo.Voc_region.Code_region from GMSN_Kurgan.dbo.Voc_region a
WHERE NOT EXISTS (select * from New.dbo.Voc_region b
WHERE b.Code_region = a.Code_region )

The multi-part identifier "GMSN_Kurgan.dbo.Voc_region.Code_region" could not be bound.

К сожалению поля принципиальны, потому что их порядок различается + добавлено вычисляемое поле
9 июл 14, 11:20    [16279827]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос профессионалам по EXISTS  [new]
Glory
Member

Откуда:
Сообщений: 104760
JesterOK
с указаниями конкретных полей не работает

Как вы думаете, что значат буквы "а","b" после имен таблиц во from ?
9 июл 14, 11:23    [16279860]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос профессионалам по EXISTS  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4262
JesterOK
Гугл подсказал что функции IGNORE в MSSQL нет

Попробуйте "покурить" EXCEPT
9 июл 14, 12:25    [16280350]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос профессионалам по EXISTS  [new]
JesterOK
Member

Откуда: Екатеринбург
Сообщений: 75
Glory,
Простите меня дурака, после унирверситета все забыл
Разобрался с вашим примером

EXCEPT покурил, правда не совсем разобрался, но приму к сведению

Можете обьяснить еще - почему при сокращении имен данный пример работает а при полном указании нет ?? или кинуть ссылку где или что поискать на эту тему ??
9 июл 14, 13:49    [16280955]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос профессионалам по EXISTS  [new]
Glory
Member

Откуда:
Сообщений: 104760
JesterOK
почему при сокращении имен данный пример работает а при полном указании нет ??

Потому, что только человек пониамет, что с помощью Ваась, Васятка и Василий Иванович в одном разговоре можно обращаться к одному человеку.
А сервер "тупой" - он к объекту обращается строго по указанному имени/псевдониму.
9 июл 14, 13:58    [16281014]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить