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

Откуда:
Сообщений: 603
clos data all
CREATE CURSOR ttt (kod n(4), naim C(10))
FOR i=1 TO 15
INSERT INTO ttt (naim) VALUES (REPLICATE(STR(i,3),5))
ENDf
UPDATE ttt SET kod=(Sele MAX(kod+1) from ttt)
BROWSE norm

Хотелось бы, чтобы переменная kod получала значение по мере выполнения запроса. Однако, значение сначала вычисляется, а потом присваивается всем записям.
15 май 13, 20:51    [14301963]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемые значения в SQL  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6901
Что значит "по мере выполнения запроса"? Вы считаете, что указанный подзапрос должен выполниться для каждой изменяемой записи?

Кроме того, смысл в таком подходе? Если вы апдейтите одну запись, то и такой подход будет верным. Если вам необходимо апдейтить все записи в новой выборке - то проще заполнить нужное поле при создании выборки.

Единственно, что я вижу - это если надо продолжить нумерацию в нескольких записях существующей таблицы. Но тогда непонятно, в каком именно порядке нумеровать эти записи... И пример, получается, ни о чём.
16 май 13, 03:28    [14302966]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемые значения в SQL  [new]
PaulWist
Member

Откуда:
Сообщений: 2236
glamis
clos data all
CREATE CURSOR ttt (kod n(4), naim C(10))
FOR i=1 TO 15
INSERT INTO ttt (naim) VALUES (REPLICATE(STR(i,3),5))
ENDf
UPDATE ttt SET kod=(Sele MAX(kod+1) from ttt)
BROWSE norm

Хотелось бы, чтобы переменная kod получала значение по мере выполнения запроса. Однако, значение сначала вычисляется, а потом присваивается всем записям.


Для поля kod надо использовать либо Autoinc либо NewID()
16 май 13, 10:06    [14303509]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемые значения в SQL  [new]
glamis
Member

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

если бы нужен был инкремент, я бы написал инкремент. А мне нужно некое вычисляемое значение.
16 май 13, 15:21    [14306102]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемые значения в SQL  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6901
glamis
А мне нужно некое вычисляемое значение.
UPDATE ttt SET kod=RECNO()
16 май 13, 17:23    [14307142]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемые значения в SQL  [new]
glamis
Member

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

код - это код, а номер записи -прикинь что будет после первого же сжатия
16 май 13, 17:27    [14307172]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемые значения в SQL  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6901
Сжатия чего? Курсора??
Иначе - неверно заданы условия, про что я упоминал выше. Не надо умалчивать критически важное...
CALCULATE MAX(kod+1) TO lnKod
SCAN FOR EMPTY(kod)
	REPLACE kod WITH lnKod
	lnKod=lnKod+1
ENDSCAN
16 май 13, 17:35    [14307228]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемые значения в SQL  [new]
PaulWist
Member

Откуда:
Сообщений: 2236
glamis
PaulWist,

если бы нужен был инкремент, я бы написал инкремент. А мне нужно некое вычисляемое значение.


Используйте ф-ию по аналогии с NewID()
16 май 13, 18:26    [14307588]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемые значения в SQL  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6901
Если не нравится использование SCAN, и надо только SQL-методы, то можно примерно так:
CALCULATE MAX(kod) TO lnKod
CREATE cursor cur1 (rn n(4), kod i AUTOINC NEXTVALUE lnKod+1)
INSERT INTO cur1 (rn) SELECT RECNO() FROM ttt WHERE EMPTY(kod)

UPDATE ttt SET kod=cur1.kod from cur1 WHERE RECNO()=cur1.rn

USE IN cur1
SELECT ttt
BROWSE norm
16 май 13, 19:37    [14307914]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемые значения в SQL  [new]
glamis
Member

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

Есть достаточно большая таблица MSSQL - порядка 20000 записей. Нало склонировать в нее же отдельный блок, заменив пару полей. На тестовом примере этот блок -порядка 700 записей. Надо учесть, что параллельно могут работать неск. юзеров. Режим, конечно не частый, но ить кто-то и всунуться могет. Как оказалось uid записи и код сильно разорваны и не хочется делать такие пропуски кодов. (uid - порядка 260000, код - порядка 20000). можно, конечно и сканить. Можно сделать код=f(uid), но интересна сама тема SQL.
17 май 13, 06:26    [14309150]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемые значения в SQL  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6901
А причём здесь Фокс? Если вам нужно обработать данные на SQL-сервере - так и надо действовать средствами T-SQL, не стОит тягать данные на клиента.
Ну и выражения "кто-то может всунуться", "большая таблица порядка 20 тыс.записей" в контексте MSSQL как-то не звучат
17 май 13, 06:34    [14309158]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемые значения в SQL  [new]
Dima T
Member

Откуда:
Сообщений: 15282
glamis
Есть достаточно большая таблица MSSQL - порядка 20000 записей. Нало склонировать в нее же отдельный блок, заменив пару полей.

Если это MS SQL - делаешь там временную таблицу (create table #MyTmp ... или select ... from MyTable into #MyTmp), заполняешь нужными данными, затем в одной транзакции (одним insert`ом) вставляешь ее содержимое в рабочую таблицу.
17 май 13, 06:35    [14309160]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемые значения в SQL  [new]
glamis
Member

Откуда:
Сообщений: 603
AndreTM
Сжатия чего? Курсора??
Иначе - неверно заданы условия, про что я упоминал выше. Не надо умалчивать критически важное...


я же не спрашиваю как мне обрабатывать таблицу. я спрашиваю о конструкции sql-update. и размеры таблиц в этом случае - это не критически важно, как и структура, связи, индексы.

AndreTM
"большая таблица порядка 20 тыс.записей" в контексте MSSQL как-то не звучат

Опять ты о размерах. Не в размере счастье...


AndreTM
А причём здесь Фокс?)

А фокс не причем. Прога на фоксе. Я же не о фоксе спрашиваю, а о конструкции SQL-Update. А это тестовый пример и cкуль-синтаксис похож.
17 май 13, 07:16    [14309178]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемые значения в SQL  [new]
glamis
Member

Откуда:
Сообщений: 603
Dima T,
Этто понятно. Не понятно как с кодом быть. Хоцца иметь max на каждую итерацию, а не перед началом вставки.
17 май 13, 07:19    [14309179]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемые значения в SQL  [new]
Dima T
Member

Откуда:
Сообщений: 15282
glamis
Хоцца иметь max на каждую итерацию, а не перед началом вставки.

Оберни в транзакцию, в начале получи в переменную max()+1 а потом бери из нее и увеличивай на 1
Я бы посоветовал всю транзакцию вынести в хранимую процедуру на MS SQL
glamis
А фокс не причем. Прога на фоксе. Я же не о фоксе спрашиваю, а о конструкции SQL-Update. А это тестовый пример и cкуль-синтаксис похож.

Синтаксис похож, а подходы к его использованию кардинально отличаются.
17 май 13, 08:14    [14309220]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемые значения в SQL  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6901
Dima T
glamis
синтаксис похож.
Синтаксис похож, а подходы к его использованию кардинально отличаются.
Во-во...
Huesos на испанском означает отнюдь не то, что вы подумали (и ударение на втором слоге)...

Ну и не надо придумывать собственных подходов - уж где-где, а именно на ресурсе sql.ru эта задача прямо в faq находится...
17 май 13, 08:32    [14309253]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемые значения в SQL  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6901
glamis
Не понятно как с кодом быть. Хоцца иметь max на каждую итерацию, а не перед началом вставки.
Дополню - ВЫ ХОТЯ БЫ ПРОВЕРИЛИ, КАК РАБОТАЮТ ВЫШЕПРИВЕДЁННЫЕ ПРИМЕРЫ? План выполнения посмотрели, например...
17 май 13, 08:36    [14309263]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить