powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SELECT и UPDATE в одном запросе?
18 сообщений из 18, страница 1 из 1
SELECT и UPDATE в одном запросе?
    #34734838
Имею две таблицы OLD.dbf и NEW.dbf.
структура OLD.dbf:
number - character
a1 - character
a2 - character
a3 - character
b1 - character
b2 - character

структура NEW.dbf:
number- character
b1 - character
b2 - character

Что необходимо сделать:
Если поле numder в OLD - такое же как в NEW, заменить поля b1 и b2 в OLD из таблицы NEW
Вопрос: можно ли это выполнить в одном SQL-запросе?
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #34734893
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
update old set b1= t2.b1, b2= t2.b2 ;
   from new  t2 ;
   where number=t2.number
тип ключа number измените
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #34734895
Игорь Трохимчук
Если поле numder в OLD - такое же как в NEW, заменить поля b1 и b2 в OLD из таблицы NEW


ошибся, numder = number
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #34734903
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если старшая версия фокспро,
то замените на инт,
для ключа вполне достаточно
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #34734970
прошелмимо
Код: plaintext
1.
2.
3.
update old set b1= t2.b1, b2= t2.b2 ;
   from new  t2 ;
   where number=t2.number
тип ключа number измените

Попробовал выполнить, выдает ошибку в команде на строке from new t2 ; - не распознанная фраза.
Ведь в конструкции update нет параметра from . (использую VFP 7.0)
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #34735119
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авториспользую VFP 7.0
с этого и нужно было начать

да это синтаксис 9-й версии

тогда релейшинами связывайте таблицы и реплейс
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #34735131
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
перейди на 9-ку - на 7-ке сидеть смысла никакого нет
трудозатраты на переделку окупятся
выигрышем, который дает исп-е новых возможностей

вот такие выкрутасы позволяет 9-я версия
Код: plaintext
1.
2.
3.
update t1 set t1.b1= t2.b1, t1.b2= t2.b2 ;
   from old t1, new  t2 ;
   where t1.number=t2.number
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #34735281
Спасибо за помощь, значит в одном запросе не выйдет.
На счет 9-й версии Вы правы, пора бы перейти :)
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #34735463
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в таблице New есть индекс по полю number, то можно так:

Код: plaintext
1.
2.
3.
4.
select old
REPLACE FOR SEEK(number,"new","number");
	b1 WITH new.b1, ;
	b2 WITH new.b2

Здесь я предполагаю, что таблицы new и old уже открыты и у таблицы new есть индекс по полю number, который так и называется "number"
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #34736144
ВладимирМЕсли в таблице New есть индекс по полю number, то можно так:

Код: plaintext
1.
2.
3.
4.
select old
REPLACE FOR SEEK(number,"new","number");
	b1 WITH new.b1, ;
	b2 WITH new.b2

Здесь я предполагаю, что таблицы new и old уже открыты и у таблицы new есть индекс по полю number, который так и называется "number"

Создаю индекс number для таблицы new :
SELECT new
INDEX ON mitgl TAG mitgl

но на строке REPLACE FOR SEEK(number,"new","number") вылазит ошибка: не найден алиас.
Таблицу new предварительно открываю так:
IF( !USED("new"))
USE new
ENDIF

Ещё пробовал так:
IF( !USED("new"))
USE new ALIAS new
ENDIF
И все равно также ругается, поэтому не знаю, что Фоксе не нравится.
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #34736196
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Трохимчук
Создаю индекс number для таблицы new :
SELECT new
INDEX ON mitgl TAG mitgl
Если Вы создаете индекс по полю NUMBER, то почему используете поле MITGL?

Игорь Трохимчукно на строке REPLACE FOR SEEK(number,"new","number") вылазит ошибка: не найден алиас.
Команда USE кроме открытия таблицы в указанной рабочей области также и закрывает таблицу, которая ранее была открыта в той же рабочей области. Если рабочая область не указана явно, то все это происходит в текущей рабочей области.

Вы хотите изменить данные в таблице Old. А открываете ее в какой рабочей области? Там же, где и таблица New?

Синтаксис должен быть примерно такой

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
IF( !USED("new"))
  USE new IN  0 
ENDIF

IF( !USED("old"))
  USE old IN  0 
ENDIF

select Old
REPLACE ...

Использование опции IN 0 говорит о том, что таблицу надо открыть в первой попавшейся свободной рабочей области. Т.е. не занятой другой таблицей.
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #34736764
__Jet__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй так:

Код: plaintext
1.
2.
3.
Update [Old] Set [b1] = [New].[b1], [b2] = [New].[b2]
From [Old]
Inner Join [New] On ([Old].[number] = [New].[number])
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #34737557
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
танцы на пустом месте
я ж советовал, релейшином свяжи и всего делов

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create cursor old (number n( 5 ), a1 c( 10 ), a2 c( 10 ), a3 c( 10 ), b1 c( 10 ), b2 c( 10 ))
for i= 1  to  10 
	insert into old (number) values (i)
endfor 

create cursor  new (number n( 5 ), b1 c( 10 ), b2 c( 10 ))
insert into new (number, b1, b2) values ( 3 , 'куку', 'кеке')
insert into new (number, b1, b2) values ( 5 , 'млпопш', 'сшпешп')
index on number tag number

select old
set relation to number into new
replace all b1 with new.b1,;
		    b2 with new.b2
set relation to
browse
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #34767547
Student_Lvov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы добавил ещё

replace all b1 with new.b1,;
b2 with new.b2 for number=new.number

Поскольку Fox иногда если number#new.number может дать значение для b1 и b2 пустое
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #34767550
Student_Lvov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы добавил ещё

replace all b1 with new.b1,;
b2 with new.b2 for number=new.number

Поскольку Fox иногда если number#new.number может дать значение для b1 и b2 пустое
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #35151681
qasd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМЕсли в таблице New есть индекс по полю number, то можно так:

Код: plaintext
1.
2.
3.
4.
select old
REPLACE FOR SEEK(number,"new","number");
	b1 WITH new.b1, ;
	b2 WITH new.b2

Здесь я предполагаю, что таблицы new и old уже открыты и у таблицы new есть индекс по полю number, который так и называется "number"

Если здесь надо будеть не толко поле number, а еще 2-й поле (допустим поле N2) проверить?
Тогда как будеть? Если индексировать по 2-м поле не получается?
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #35152520
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получится. Если создать составной индекс по двум полям. Например, так

Код: plaintext
INDEX ON STR(N1)+STR(N2) TAG MyTag

Соответственно и искать надо будет составное выражение.

Только следует иметь в виду, что создание каждого индекса "утяжеляет" проект. Это значит, что создавть индексы для "разовой" операции - не стоит. Особенно следует избегать именно составных индексов. Затраты не окупаются.

Если это разовая задача, и время выполнения обновления не критично, то можно делать обновление "в лоб". По одной записи за раз.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select Tab2
SET ORDER TO  0 
select Tab1
SET ORDER TO  0 
SCAN
	select Tab2
	LOCATE FOR F1 = tab1.F1 AND F2 = tab1.F2
	select Tab1
	IF FOUND("Tab2")
		REPLACE b1= tab2.b1, b2= tab2.b2
	ENDIF
ENDSCAN

Кстати, если в таблице Tab2 есть два отдельных индекса по полю F1 и по полю F2, то такой код будет выполняться достаточно быстро
...
Рейтинг: 0 / 0
SELECT и UPDATE в одном запросе?
    #35152522
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В синтаксисе команды REPLACE ошибся. Разумеется, надо писать так

Код: plaintext
REPLACE b1 WITH tab2.b1, b2 WITH tab2.b2
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SELECT и UPDATE в одном запросе?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]