Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-94799
Мыш
2003-05-14 19:05
2003.05.29
Abstract error


14-95064
race1
2003-05-09 17:01
2003.05.29
---|Ветка была без названия|---


1-94907
tv
2003-05-16 18:30
2003.05.29
Запрет перетаскивания окна


3-94739
foxsi
2003-05-09 20:29
2003.05.29
нумерация


3-94762
Jaik
2003-05-11 11:42
2003.05.29
Сохранение отсортированной выборки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский