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

Откуда:
Сообщений: 11
Здравствуйте, подскажите. Может есть способ другой.
Хотел сделать что-то типа (неработающий запрос):

INSERT INTO vipolnenie (id_sotrudnik, id_pokazatel)

SELECT id_sotrudnik, id_pokazatel FROM sotrudnik_pokazatel 

WHERE (id_sotrudnik,id_pokazatel)

NOT IN(SELECT id_sotrudnik, id_pokazatel FROM vipolnenie )

мне надо INSERT чтоб пара id_sotrudnik,id_pokazatel не повторялась

Может и просто решается, но что-то стал вот на этом и всё...

MSSQL 9.0
22 авг 11, 11:57    [11155835]     Ответить | Цитировать Сообщить модератору
 Re: аналог NOT IN для двух полей  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35396
Блог
NOT EXISTS
22 авг 11, 11:58    [11155857]     Ответить | Цитировать Сообщить модератору
 Re: аналог NOT IN для двух полей  [new]
Unit11
Member

Откуда:
Сообщений: 11
Спасибо, добрый человек, никогда не пользовался.
22 авг 11, 12:14    [11156008]     Ответить | Цитировать Сообщить модератору
 Re: аналог NOT IN для двух полей  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Или
CREATE UNIQUE INDEX uiVipolnenie ON vipolnenie(id_sotrudnik,id_pokazatel) WITH(IGNORE_DUP_KEY=ON);
22 авг 11, 12:21    [11156081]     Ответить | Цитировать Сообщить модератору
 Re: аналог NOT IN для двух полей  [new]
Unit11
Member

Откуда:
Сообщений: 11
ну это тоже надо, сенкс
22 авг 11, 12:32    [11156171]     Ответить | Цитировать Сообщить модератору
 Re: аналог NOT IN для двух полей  [new]
MedkiN
Member

Откуда:
Сообщений: 21
INSERT INTO vipolnenie (id_sotrudnik, id_pokazatel)
select sp.id_sotrudnik, sp.id_pokazatel FROM sotrudnik_pokazatel sp
	left join vipolnenie v on sp.id_sotrudnik = v.id_sotrudnik and  sp.id_pokazatel = v.id_pokazatel
where v.id_sotrudnik  is null and  v.id_pokazatel is null
22 авг 11, 12:58    [11156379]     Ответить | Цитировать Сообщить модератору
 Re: аналог NOT IN для двух полей  [new]
Unit11
Member

Откуда:
Сообщений: 11
а так даже не представлял что можно
23 авг 11, 14:44    [11164440]     Ответить | Цитировать Сообщить модератору
 Re: аналог NOT IN для двух полей  [new]
Unit11
Member

Откуда:
Сообщений: 11
спасибо, пригодилось и в другой базе где нет EXISTS
23 авг 11, 14:45    [11164459]     Ответить | Цитировать Сообщить модератору
 Re: аналог NOT IN для двух полей  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
Unit11
Здравствуйте, подскажите. Может есть способ другой.
Хотел сделать что-то типа (неработающий запрос):

INSERT INTO vipolnenie (id_sotrudnik, id_pokazatel)

SELECT id_sotrudnik, id_pokazatel FROM sotrudnik_pokazatel 

WHERE (id_sotrudnik,id_pokazatel)

NOT IN(SELECT id_sotrudnik, id_pokazatel FROM vipolnenie )

мне надо INSERT чтоб пара id_sotrudnik,id_pokazatel не повторялась

Может и просто решается, но что-то стал вот на этом и всё...

MSSQL 9.0


-- В cte выбираем все записи из sotrudnik_pokazatel, которых нет в vipolnenie ( оператор EXCEPT)
-- и затем вставляем их в vipolnenie
;WITH cte (id_sotrudnik, id_pokazatel)
(
    SELECT id_sotrudnik, id_pokazatel  FROM sotrudnik_pokazatel 
    EXCEPT 
    SELECT id_sotrudnik, id_pokazatel FROM vipolnenie 
)
INSERT INTO vipolnenie (id_sotrudnik, id_pokazatel)
SELECT id_sotrudnik, id_pokazatel 
FROM cte
С уважением, Алексей
P.S. В SQL 2008 вышу задачу можно сделать еще проще с помошью команды MERGE
24 авг 11, 08:29    [11168734]     Ответить | Цитировать Сообщить модератору
 Re: аналог NOT IN для двух полей  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Aleksey-K,

а CTE-то зачем?
24 авг 11, 09:10    [11168863]     Ответить | Цитировать Сообщить модератору
 Re: аналог NOT IN для двух полей  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
iap
Aleksey-K,

а CTE-то зачем?

Исключительно с методологической целью :)
Более понятный код.
С уважением, Алексей
24 авг 11, 09:24    [11168911]     Ответить | Цитировать Сообщить модератору
 Re: аналог NOT IN для двух полей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31978
Aleksey-K
iap
Aleksey-K,

а CTE-то зачем?

Исключительно с методологической целью :)
Более понятный код.
С уважением, Алексей
По моему, подзапросы легче читаются...

;WITH cte (id_sotrudnik, id_pokazatel)
(
    SELECT id_sotrudnik, id_pokazatel  FROM sotrudnik_pokazatel 
    EXCEPT 
    SELECT id_sotrudnik, id_pokazatel FROM vipolnenie 
)
INSERT INTO vipolnenie (id_sotrudnik, id_pokazatel)
SELECT id_sotrudnik, id_pokazatel 
FROM cte

INSERT INTO vipolnenie (id_sotrudnik, id_pokazatel)
SELECT id_sotrudnik, id_pokazatel  
FROM (
    SELECT id_sotrudnik, id_pokazatel  FROM sotrudnik_pokazatel 
    EXCEPT 
    SELECT id_sotrudnik, id_pokazatel FROM vipolnenie 
) t
24 авг 11, 09:31    [11168936]     Ответить | Цитировать Сообщить модератору
 Re: аналог NOT IN для двух полей  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
alexeyvg
Aleksey-K
пропущено...

Исключительно с методологической целью :)
Более понятный код.
С уважением, Алексей
По моему, подзапросы легче читаются...

;WITH cte (id_sotrudnik, id_pokazatel)
(
    SELECT id_sotrudnik, id_pokazatel  FROM sotrudnik_pokazatel 
    EXCEPT 
    SELECT id_sotrudnik, id_pokazatel FROM vipolnenie 
)
INSERT INTO vipolnenie (id_sotrudnik, id_pokazatel)
SELECT id_sotrudnik, id_pokazatel 
FROM cte

INSERT INTO vipolnenie (id_sotrudnik, id_pokazatel)
SELECT id_sotrudnik, id_pokazatel  
FROM (
    SELECT id_sotrudnik, id_pokazatel FROM sotrudnik_pokazatel 
    EXCEPT 
    SELECT id_sotrudnik, id_pokazatel FROM vipolnenie 
) t
INSERT vipolnenie (id_sotrudnik, id_pokazatel)
SELECT id_sotrudnik, id_pokazatel FROM sotrudnik_pokazatel 
EXCEPT 
SELECT id_sotrudnik, id_pokazatel FROM vipolnenie;
Очень тяжело читается!
24 авг 11, 09:34    [11168948]     Ответить | Цитировать Сообщить модератору
 Re: аналог NOT IN для двух полей  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
alexeyvg, может быть, но по своему опыту могу сказать, что объяснять новичкам проще с CTE
P.S. А зачем подзапрос? Если упрощать, то достаточно простого INSERT ... SELECT
INSERT INTO vipolnenie (id_sotrudnik, id_pokazatel)
SELECT id_sotrudnik, id_pokazatel  FROM sotrudnik_pokazatel 
EXCEPT 
SELECT id_sotrudnik, id_pokazatel FROM vipolnenie 
24 авг 11, 09:36    [11168961]     Ответить | Цитировать Сообщить модератору
 Re: аналог NOT IN для двух полей  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
iap
INSERT INTO vipolnenie (id_sotrudnik, id_pokazatel)
SELECT id_sotrudnik, id_pokazatel FROM sotrudnik_pokazatel
EXCEPT
SELECT id_sotrudnik, id_pokazatel FROM vipolnenie;[/src]Очень тяжело читается!

Представьте себе, что тем, кто только переходит на T-SQL тяжело!
Подряд идут две команды (INSERT, SELECT) и предикат связи (EXCEPT).
с CTE команды выглядит более похожей на ОДНУ команду.
С уважением, Алексей
24 авг 11, 09:43    [11168995]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить