Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Скрипт SELECT-IF-UPDATE-ELSE-INSERT / 12 сообщений из 12, страница 1 из 1
04.09.2009, 00:46
    #36177999
Vady
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрипт SELECT-IF-UPDATE-ELSE-INSERT
Доброе время суток!
Раньше работал только с СУБД MySQL, поэтому, к сожалению, владею VFP на уровне языка SQL. В интернете читал мануалы про операторы, процедуры, функции, циклы и проч, но нужных мне примеров не нашел.
Вот ставлю задачу по импортированию данных из одной таблицы в другую одним скриптом для реализации в программе на Delphi при помощи компонента ADO, связанной с FoxPro.
Вот что примерно надо:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select * from table1 //загружаем все данные таблицы
table1.cursor.begin //перемещаем курсор в самое начало результата запроса
do while table1.cursor.end; //циклим до конца таблицы
  if такая строка есть в таблице table2 //это понятно
    update table2 set ... from table1 where... //обновляем строку
  else
    insert into table1... //иначе добавляем строку, т.к. подобной нет в таблице
  endif
  table1.cursor.next; //переходим на следующую строку в цикле.
enddo;
Можно ли подобное реализовать при помощи ADOQuery? Если да, то как правильнее составлять подобный скрипт?
...
Рейтинг: 0 / 0
04.09.2009, 10:35
    #36178374
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрипт SELECT-IF-UPDATE-ELSE-INSERT
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
* Обновление данных в Table1 данными из Table2

UPDATE table1 ;
SET 	Field1 = table2.Field1 ;
	,Field2 = table2.field2 ;
FROM table2 ;
WHERE table2.ID = table1.ID

* Добавление записей в Table1 данными из Table2

INSERT INTO table1 (Field1, Field2) ;
SELECT Field1, Field2 ;
FROM table2 ;
WHERE NOT EXISTS(select 'x' from table1 t1 where t1.ID = table2.ID)

В данном случае предполагается, что (такая строка есть в таблице table2) - это связь по полю ID.
...
Рейтинг: 0 / 0
04.09.2009, 11:56
    #36178614
Vady
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрипт SELECT-IF-UPDATE-ELSE-INSERT
ВладимирМ, вся проблема в том, что в импортируемой таблице нет идентификаторов, да и содержит как старые, так и новые документы на одного и того же человека, поэтому сравнение делаю по 4-м столбцам: фам, им, от, дата рожд. и отбор по дате выдачи документа через join. Делать сложный запрос не решаюсь, т.к. не буду уверен в правильности составления.
Куда проще разбить все это на простые запросы и циклить их внутри FoxPro.
...
Рейтинг: 0 / 0
04.09.2009, 12:11
    #36178673
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрипт SELECT-IF-UPDATE-ELSE-INSERT
Подобное отношение до сих пор поражает. Неужели так сложно самому чуть-чуть подумать и адаптировать приведенный пример под свои потребности?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
* Обновление данных в Table1 данными из Table2

UPDATE table1 ;
SET 	Field1 = table2.Field1 ;
	,Field2 = table2.field2 ;
FROM table2 ;
WHERE 	table2.fam = table1.fam ;
	AND table2.im = table1.im ;
	AND table2.otch = table1.otch ;
	AND table2.bd = table1.bd

Если же вы не можете сформировать набор полей по которым ОДНОЗНАЧНО можно сказать есть такая запись в таблице или нет, то вы никаким способами не сможете решить проблему, поскольку в языке запросов Select-SQL не существует таких понятий как "текущая запись", "предыдущая запись", "последующая запись". А передача данных из одной среды в другую именно запросами Select-SQL и выполняется.
...
Рейтинг: 0 / 0
04.09.2009, 20:22
    #36179900
BMJ
BMJ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрипт SELECT-IF-UPDATE-ELSE-INSERT
Пожалуйста разъясните, при таком синтаксисе
UPDATE table1 ;
SET Field1 = table2.Field1 ;
,Field2 = table2.field2 ;
FROM table2 ;
WHERE table2.fam = table1.fam ;
AND table2.im = table1.im ;
AND table2.otch = table1.otch ;
AND table2.bd = table1.bd
У меня в таблице1 обновлялись только данные соответствующие Первой записи таблицы2, выкручивался использованием дополнительно FORCE что делал не так, почему без "привеска" не работало?
...
Рейтинг: 0 / 0
04.09.2009, 22:12
    #36179964
Vady
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрипт SELECT-IF-UPDATE-ELSE-INSERT
ВладимирМ,
Запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
UPDATE table1 ;
SET 	Field1 = table2.Field1 ;
	,Field2 = table2.field2 ;
FROM table2 ;
WHERE 	table2.fam = table1.fam ;
	AND table2.im = table1.im ;
	AND table2.otch = table1.otch ;
	AND table2.bd = table1.bd
выдает ошибку: FAM is not unique and must be qualified

Хотя я сделал такой запрос:

Код: plaintext
1.
2.
3.
4.
5.
SELECT a.* FROM table1 as a, table1 as b 
WHERE 	a.fam=b.fam 
	AND a.im=b.im 
	AND a.ot=b.ot 
	AND a.dr=b.dr 
	AND a.id<>b.id
Результат: 0
...
Рейтинг: 0 / 0
04.09.2009, 23:11
    #36179992
BMJ
BMJ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрипт SELECT-IF-UPDATE-ELSE-INSERT
table1 выбираете как а и б?
...
Рейтинг: 0 / 0
05.09.2009, 00:06
    #36180014
Vady
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрипт SELECT-IF-UPDATE-ELSE-INSERT
BMJ, конечно, это самообъединение таблиц.
...
Рейтинг: 0 / 0
05.09.2009, 01:24
    #36180038
thunder2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрипт SELECT-IF-UPDATE-ELSE-INSERT
VadyBMJ, конечно, это самообъединение таблиц.

Самообъединение таблиц ? Это что-то новое ))
Вы в запросе указали одну и ту же таблицу с разными псевдонимами. Получается, что запрос работает по одной и той же таблицы, сравнивая поле id текущей записи и полем id этой же записи. Результат вполне закономерен.
...
Рейтинг: 0 / 0
05.09.2009, 10:56
    #36180096
Vady
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрипт SELECT-IF-UPDATE-ELSE-INSERT
thunder2, любые запросы на выборку с использованием двух и более таблиц называют объединением таблиц, а если таблица одна и та же, то это самообъединение.
Результат действительно закономерен. Это говорит о том, что полных дубликатов по столбцам fam, im, ot, dr нет. Вопрос в том, почему
авторЗапрос:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
UPDATE table1 ;
SET 	Field1 = table2.Field1 ;
	,Field2 = table2.field2 ;
FROM table2 ;
WHERE 	table2.fam = table1.fam ;
	AND table2.im = table1.im ;
	AND table2.otch = table1.otch ;
	AND table2.bd = table1.bd

выдает ошибку: FAM is not unique and must be qualified
?
...
Рейтинг: 0 / 0
05.09.2009, 13:18
    #36180174
Fffffffffff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрипт SELECT-IF-UPDATE-ELSE-INSERT
Такое сообщение возникает, когда в запросе присутствуют два поля с одинаковыми именами, но явно не указывается перед ними названия таблиц.
...
Рейтинг: 0 / 0
05.09.2009, 14:32
    #36180216
Vady
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрипт SELECT-IF-UPDATE-ELSE-INSERT
Fffffffffff, точно, спасибо!
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Скрипт SELECT-IF-UPDATE-ELSE-INSERT / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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