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

Откуда: Житомир, Украина
Сообщений: 12
Имею две таблицы 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-запросе?
17 авг 07, 14:40    [4540235]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
прошелмимо
Guest
update old set b1= t2.b1, b2= t2.b2 ;
   from new  t2 ;
   where number=t2.number
тип ключа number измените
17 авг 07, 14:56    [4540379]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
Игорь Трохимчук
Member

Откуда: Житомир, Украина
Сообщений: 12
Игорь Трохимчук

Если поле numder в OLD - такое же как в NEW, заменить поля b1 и b2 в OLD из таблицы NEW


ошибся, numder = number
17 авг 07, 14:57    [4540391]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
прошелмимо
Guest
если старшая версия фокспро,
то замените на инт,
для ключа вполне достаточно
17 авг 07, 14:59    [4540410]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
Игорь Трохимчук
Member

Откуда: Житомир, Украина
Сообщений: 12
прошелмимо
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)
17 авг 07, 15:09    [4540551]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
прошелмимо
Guest
автор
использую VFP 7.0

с этого и нужно было начать

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

тогда релейшинами связывайте таблицы и реплейс
17 авг 07, 15:37    [4540838]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
прошелмимо
Guest
перейди на 9-ку - на 7-ке сидеть смысла никакого нет
трудозатраты на переделку окупятся
выигрышем, который дает исп-е новых возможностей

вот такие выкрутасы позволяет 9-я версия
update t1 set t1.b1= t2.b1, t1.b2= t2.b2 ;
   from old t1, new  t2 ;
   where t1.number=t2.number
17 авг 07, 15:39    [4540862]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
Игорь Трохимчук
Member

Откуда: Житомир, Украина
Сообщений: 12
Спасибо за помощь, значит в одном запросе не выйдет.
На счет 9-й версии Вы правы, пора бы перейти :)
17 авг 07, 16:21    [4541241]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Если в таблице New есть индекс по полю number, то можно так:

select old
REPLACE FOR SEEK(number,"new","number");
	b1 WITH new.b1, ;
	b2 WITH new.b2

Здесь я предполагаю, что таблицы new и old уже открыты и у таблицы new есть индекс по полю number, который так и называется "number"
17 авг 07, 17:05    [4541573]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
Игорь Трохимчук
Member

Откуда: Житомир, Украина
Сообщений: 12
ВладимирМ
Если в таблице New есть индекс по полю number, то можно так:

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
И все равно также ругается, поэтому не знаю, что Фоксе не нравится.
18 авг 07, 01:30    [4543011]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Игорь Трохимчук

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

Если Вы создаете индекс по полю NUMBER, то почему используете поле MITGL?

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

Команда USE кроме открытия таблицы в указанной рабочей области также и закрывает таблицу, которая ранее была открыта в той же рабочей области. Если рабочая область не указана явно, то все это происходит в текущей рабочей области.

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

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

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

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

select Old
REPLACE ...

Использование опции IN 0 говорит о том, что таблицу надо открыть в первой попавшейся свободной рабочей области. Т.е. не занятой другой таблицей.
18 авг 07, 09:46    [4543104]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
__Jet__
Member

Откуда:
Сообщений: 26
Попробуй так:

Update [Old] Set [b1] = [New].[b1], [b2] = [New].[b2]
From [Old]
Inner Join [New] On ([Old].[number] = [New].[number])
19 авг 07, 02:39    [4544082]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
прошелмимо
Guest
танцы на пустом месте
я ж советовал, релейшином свяжи и всего делов

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
20 авг 07, 09:52    [4545379]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
Student_Lvov
Guest
Я бы добавил ещё

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

Поскольку Fox иногда если number#new.number может дать значение для b1 и b2 пустое
31 авг 07, 12:53    [4603496]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
Student_Lvov
Guest
Я бы добавил ещё

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

Поскольку Fox иногда если number#new.number может дать значение для b1 и b2 пустое
31 авг 07, 12:54    [4603501]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
qasd
Guest
ВладимирМ
Если в таблице New есть индекс по полю number, то можно так:

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-м поле не получается?
23 фев 08, 13:04    [5330933]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Получится. Если создать составной индекс по двум полям. Например, так

INDEX ON STR(N1)+STR(N2) TAG MyTag

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

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

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

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, то такой код будет выполняться достаточно быстро
24 фев 08, 16:10    [5332550]     Ответить | Цитировать Сообщить модератору
 Re: SELECT и UPDATE в одном запросе?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
В синтаксисе команды REPLACE ошибся. Разумеется, надо писать так

REPLACE b1 WITH tab2.b1, b2 WITH tab2.b2
24 фев 08, 16:11    [5332554]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить