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

Откуда:
Сообщений: 334
есть таблица:
create table Table(
id int identity(1,1),
Param1 varchar(50) not null,
Param2 varchar(50) not null,
Param3 varchar(50) not null,
Type varchar(5) not null,
constraint PK_Table (Param1,Param2,Param3,Type)
)

в таблице содержатся записи со значениями в поле Type 'run' и 'try'
мне нужно выполить вставку в Table тех строк со значениями Type = 'try', которых нет со значениями Type = 'run'. Чтоб уникальность PK_Table не нарушалась.
p.s. потом я значения записи с Type = 'try' удалю.

помогите со скриптом, плиз.
15 июн 15, 15:11    [17772225]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4392
Вставку откуда?
Из другой таблицы или из переменных?
15 июн 15, 15:21    [17772290]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
Glory
Member

Откуда:
Сообщений: 104760
=Сергей=
мне нужно выполить вставку в Table тех строк со значениями Type = 'try', которых нет со значениями Type = 'run'. Чтоб уникальность PK_Table не нарушалась.

И что вам мешает это сделать ?
Напишите запрос, который выберет из "Table тех строк со значениями Type = 'try', которых нет со значениями Type = 'run'"
15 июн 15, 15:22    [17772296]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
=Сергей=
Member

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

из этой же таблицы (там немного строк, так что не пинайте)
15 июн 15, 15:23    [17772303]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
Glory
Member

Откуда:
Сообщений: 104760
=Сергей=
(там немного строк, так что не пинайте)

Т.е. писать за вас элементарный запрос SELECT с фильтром что ли ?
15 июн 15, 15:27    [17772328]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
Glory,
пробовал так:
insert into Table(Param1,Param2,Param3,Type)
select Param1,Param2,Param3,'run' from Table a
where not exists (select 1 from Table b
where a.Param1 = b.Param1
and a.Param2 = b.Param2
and a.Param3 = b.Param3
and a.Type = 'run')
and a.Type = 'try'

Возникает ошибка дублирования ключа PK_Table.
15 июн 15, 15:57    [17772484]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
Glory
Member

Откуда:
Сообщений: 104760
=Сергей=
and a.Type = 'run'

Потому что должно быть b.Type = 'run'
15 июн 15, 16:01    [17772502]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4392
А огород-то зачем городить?
Записи с 'try' вы потом собираетесь удалять?
Делайте сразу
UPDATE Table
SET Type = 'run'
WHERE Type = 'try'
15 июн 15, 16:27    [17772626]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1695
SQL2008
А огород-то зачем городить?
Записи с 'try' вы потом собираетесь удалять?
Делайте сразу
UPDATE Table
SET Type = 'run'
WHERE Type = 'try'

и натолкнетесь сразу на ограничение первичного ключа
15 июн 15, 16:33    [17772654]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4392
felix_ff
SQL2008
А огород-то зачем городить?
Записи с 'try' вы потом собираетесь удалять?
Делайте сразу
UPDATE Table
SET Type = 'run'
WHERE Type = 'try'

и натолкнетесь сразу на ограничение первичного ключа

Разумеется тут нужно добавлять проверку на отсутствие такой записи!
Но я пределагаю направление движения, а не готовое решение.
15 июн 15, 16:40    [17772685]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
а может надо начать еще раньше?
с какой целью пишите сей запрос?
15 июн 15, 16:42    [17772701]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
Викинг_Tyler
Member

Откуда:
Сообщений: 81
felix_ff
SQL2008
А огород-то зачем городить?
Записи с 'try' вы потом собираетесь удалять?
Делайте сразу
UPDATE Table
SET Type = 'run'
WHERE Type = 'try'

и натолкнетесь сразу на ограничение первичного ключа

Прекрасно отработало
create table dbo.test(
id int identity(1,1),
Param1 varchar(50) not null,
Param2 varchar(50) not null,
Param3 varchar(50) not null,
Type varchar(5) not null,
constraint PK_Table PRIMARY KEY (Param1,Param2,Param3,Type) 
);

INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('1','1','1','try');
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('2','2','2','run');
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('3','3','3','try');
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('4','4','4','run');
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('5','5','5','try');
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('6','6','6','run');

SELECT * FROM dbo.test;

UPDATE dbo.test SET Type='run' WHERE type='try';

SELECT * FROM dbo.test;
15 июн 15, 17:37    [17772960]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
Викинг_Tyler
Member

Откуда:
Сообщений: 81
=Сергей=
Glory,
пробовал так:
insert into Table(Param1,Param2,Param3,Type)
select Param1,Param2,Param3,'run' from Table a
where not exists (select 1 from Table b
where a.Param1 = b.Param1
and a.Param2 = b.Param2
and a.Param3 = b.Param3
and a.Type = 'run')
and a.Type = 'try'

Возникает ошибка дублирования ключа PK_Table.

И этот вариант работает. Видимо у вас ошибка была при создании таблицы
15 июн 15, 17:40    [17772971]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
Mike_za
а может надо начать еще раньше?
с какой целью пишите сей запрос?

Уважаемые друзья, запрос делался для однократного устранения неких сложностей, поэтому я не стал уделять должного внимания оптимизации.
Проблема решена, большое спасибо всем откликнувшимся.
15 июн 15, 18:23    [17773200]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1695
Викинг_Tyler
felix_ff
пропущено...

и натолкнетесь сразу на ограничение первичного ключа

Прекрасно отработало
create table dbo.test(
id int identity(1,1),
Param1 varchar(50) not null,
Param2 varchar(50) not null,
Param3 varchar(50) not null,
Type varchar(5) not null,
constraint PK_Table PRIMARY KEY (Param1,Param2,Param3,Type) 
);

INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('1','1','1','try');
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('2','2','2','run');
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('3','3','3','try');
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('4','4','4','run');
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('5','5','5','try');
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('6','6','6','run');

SELECT * FROM dbo.test;

UPDATE dbo.test SET Type='run' WHERE type='try';

SELECT * FROM dbo.test;


добавьте
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('6','6','6','try');

и вывалится ошибка

как уже уточнил SQL2008 нужна проверка на отсутствие предполагаемой строки замены.
я просто уточнил что совет использовать голый update table было некорректно
16 июн 15, 01:13    [17774093]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4392
felix_ff
Викинг_Tyler
пропущено...

Прекрасно отработало
create table dbo.test(
id int identity(1,1),
Param1 varchar(50) not null,
Param2 varchar(50) not null,
Param3 varchar(50) not null,
Type varchar(5) not null,
constraint PK_Table PRIMARY KEY (Param1,Param2,Param3,Type) 
);

INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('1','1','1','try');
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('2','2','2','run');
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('3','3','3','try');
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('4','4','4','run');
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('5','5','5','try');
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('6','6','6','run');

SELECT * FROM dbo.test;

UPDATE dbo.test SET Type='run' WHERE type='try';

SELECT * FROM dbo.test;


добавьте
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('6','6','6','try');

и вывалится ошибка

Никакой ошибки не вываливается!
16 июн 15, 11:07    [17775167]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1695
SQL2008
felix_ff
пропущено...


добавьте
INSERT INTO dbo.test(Param1,Param2,Param3,Type)VALUES('6','6','6','try');

и вывалится ошибка

Никакой ошибки не вываливается!


та ладна?
create table #test(
id int identity(1,1),
Param1 varchar(50) not null,
Param2 varchar(50) not null,
Param3 varchar(50) not null,
Type varchar(5) not null,
constraint PK_Table PRIMARY KEY (Param1,Param2,Param3,Type) 
);

INSERT INTO #test(Param1,Param2,Param3,Type)VALUES('1','1','1','try');
INSERT INTO #test(Param1,Param2,Param3,Type)VALUES('2','2','2','run');
INSERT INTO #test(Param1,Param2,Param3,Type)VALUES('3','3','3','try');
INSERT INTO #test(Param1,Param2,Param3,Type)VALUES('4','4','4','run');
INSERT INTO #test(Param1,Param2,Param3,Type)VALUES('5','5','5','try');
INSERT INTO #test(Param1,Param2,Param3,Type)VALUES('6','6','6','run');
INSERT INTO #test(Param1,Param2,Param3,Type)VALUES('6','6','6','try');

SELECT * FROM #test

UPDATE #test SET Type='run' WHERE type='try';

SELECT * FROM #test
16 июн 15, 15:51    [17777308]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4392
felix_ff
SQL2008
пропущено...

Никакой ошибки не вываливается!


та ладна?
...
INSERT INTO #test(Param1,Param2,Param3,Type)VALUES('6','6','6','run');
...

UPDATE #test SET Type='run' WHERE type='try';

SELECT * FROM #test

И где у вас в первом примере вставка:
...
INSERT INTO #test(Param1,Param2,Param3,Type)VALUES('6','6','6','run');
...

Если вы купили билет в Тулу, а сели в поезд в Самару, то стрелочник тут не при чем!
16 июн 15, 18:05    [17778116]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4392
SQL2008
Опечатался, должно быть

"И где у вас в первом примере вставка:
":
...
INSERT INTO #test(Param1,Param2,Param3,Type)VALUES('6','6','6','try');
...

16 июн 15, 18:08    [17778132]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1695
SQL2008
SQL2008
Опечатался, должно быть

"И где у вас в первом примере вставка:
":
...
INSERT INTO #test(Param1,Param2,Param3,Type)VALUES('6','6','6','try');
...



Вы и сами можете прекрасно понять почему я написал именно так:
16 июн 15, 18:14    [17778159]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4392
felix_ff
SQL2008
пропущено...


Вы и сами можете прекрасно понять почему я написал именно так:

Теперь понятно - имелось в виду, что добавить ко всем инсертам, а не после выполнения скрипта.
Лучше говорить об этом сразу во избежание недоразумений.
16 июн 15, 18:21    [17778200]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить