Главная страница
    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.008 c
3-94751
Robber
2003-05-11 13:44
2003.05.29
Вопрос! Как упаковать БД в Delphi?


3-94769
Levan Varshanidze
2003-05-12 11:25
2003.05.29
Таблица с автоинкрементым полем: как повторить запись


1-94868
borg
2003-05-20 12:06
2003.05.29
Много кнопок


3-94735
Andrey Filatow
2003-05-08 16:30
2003.05.29
Фильтрация в TQuery


3-94675
_Narayan_
2003-05-11 10:04
2003.05.29
BEFORE insert





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский