Форум: "Базы";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];
ВнизВопрос по SQL (MS SQL Server) Найти похожие ветки
← →
Levan Varshanidze (2003-05-07 09:14) [0]Привет мастерам!
Есть две таблицы
table1
c1 c2 c3
---------------------------------------------
a 7 0
b 8 0
table2
c1 c3
----------------------
x 1
y 2
x 3
z 4
(Поле C3 ведкт себя , как IDENTITY, но без атрибута IDENTITY -
это очень важно)
Хочу добавить в table2
c1 c3
----------------------
a 5
b 6
Пишу запрос:
insert into table2
select c1,(select max(c3)+1 from table2)
from table1
но втутренный (select max(c3)+1 from table2) для обоих записей из table1 возвращает одно и то же значение 5
(т.е. вычисляется ОДИНЬ раз для всех записей из первой таблицы, а не каждый раз при добавлении новой записи с учетом только-что
добавленной последней записи)
и вместо добавления
c1 c3
----------------------
a 5
b 6
добавляется
c1 c3
----------------------
a 5
b 5
Ясно, что я не совсем точно представляю работу запроса
Посоветуйте, как составить запрос
(но не IDENTity для поля C3)
← →
NAlexey (2003-05-07 10:03) [1]Сначала происходит выборка значений, потом вставка уже выбранных, отсюда и результат. Предложить могу вот что, попробуй, может поможет:
INSERT INTO table2
SELECT t1.*,
(SELECT Sum(1) +
(SELECT MAX(c3) FROM table2)
FROM table2 t2
WHERE t2.c3 <= t1.c3) AS MyName
FROM table1 AS t1
Доработаешь если что, напиши результат...
← →
Danilka (2003-05-07 10:15) [2]вообще-то max()+1 нехорошо пользоваться.
есть генераторы (в интербейсе) сиквенсы (в орокле) в МС-Скуле, тоже есть что-то типа этого.
во-первых, если двое юзеров одновременно добавляют запись, то и max у них будет одинаковый, кто-то из них получит глюк.
во-вторых, "select max()" намного тяжелее для сервера, чем дергануть счетчик.
← →
AlexGuest (2003-05-07 11:14) [3]Проще организовать Fetch по T1 и внутри него инсертить в T2 по одной записи,
тогда каждая последующая из T1 запись в твоем запросе с max(..) будет возвращать увеличенное на 1 значение.
← →
Levan Varshanidze (2003-05-07 11:45) [4]>NAlexey
К сожалению, результат тот же
>AlexGuest
Согласен, но :
этот код должен сидеть в хранимой процедуре и пока хочу обойти без FETCH и без цикла, если, конечно, смогу :)
← →
NAlexey (2003-05-07 12:28) [5]>К сожалению, результат тот же
Не знаю почему, необходимо смотреть что за ситуация. Но вот как я делаю в моем случае:
SELECT * FROM Idents
результат:
DATATYP IDENT
7 1386
8 326392
9 1681
10 469621
11 3251
13 481746
23 387
24 72
12 1853
27 572
36 18
46 4868
43 132011
вот такой запрос:
SELECT t1.*,
(SELECT Sum(1) +
(SELECT MAX(DataTyp) FROM Idents)
FROM Idents t2
WHERE t2.DataTyp <= t1.Datatyp) AS MyName
FROM Idents AS t1
Даёт результат:
DATATYP UDENT MyNAME
7 1386 47
8 326392 48
9 1681 49
10 469621 50
11 3251 51
13 481746 53
23 387 54
24 72 55
12 1853 52
27 572 56
36 18 57
46 4868 59
43 132011 58
Я дал приблизительный ответ, тебе манипулировать.
← →
MOA (2003-05-07 12:38) [6]>этот код должен сидеть в хранимой процедуре
Есть вариант с временной таблицей и IDENTITY(int,1,1).
Удачи.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c