Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / помогите получить дельту данных / 20 сообщений из 20, страница 1 из 1
02.08.2007, 16:24
    #34701856
lvdenis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите получить дельту данных
Помогите, пожалуста, получить дельту данных.
существует таблица "договора" за май и таблица "договора" за июнь.
причем в договора за июнь входят данные за май и июнь.
помогите получить дельту этих данных.
...
Рейтинг: 0 / 0
02.08.2007, 16:28
    #34701888
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите получить дельту данных
как Вы умучили, продавцы полосатых палочек ...

нарисуй сюда таблички
и нарисуй результат, который хочется получить

народ посмотрит и покажет ответ
...
Рейтинг: 0 / 0
02.08.2007, 16:52
    #34702020
lvdenis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите получить дельту данных
структура таблицы договоров за май и июнь - идентична и приведена снизу.
CREATE TABLE dogovor
(
DOG NUMBER(4),
FOMS NUMBER(3),
LID NUMBER(4),
LID_ENT NUMBER(14),
NOMDOG VARCHAR2(14 BYTE),
TYPEDOG NUMBER(1),
DATE_POD DATE,
PLACE VARCHAR2(50 BYTE),
DATE_REG DATE,
DATE_S DATE,
DATE_E DATE,
DATE_NULL DATE,
NUM_ZAS NUMBER(6),
CAUSE NUMBER(2),
FREEDATE NUMBER(1),
DATE_REZ DATE,
KOD_REZ NUMBER,
TYPE_PLACE NUMBER(1),
KOD_PLACE NUMBER(6),
TYPE_ENT NUMBER(2),
PRINT_RUC NUMBER(1),
NUM_INOSTR NUMBER(6),
DOGOVOR_ID NUMBER
)
таблица договора за май называются dogovor_may,
таблица договора за июнь называются dogovor_iun.

в таблице dogovor_iun содержатся данные за июнь и за май.
необходимо выловить дельту данных. только договора за июнь.
...
Рейтинг: 0 / 0
02.08.2007, 20:02
    #34702580
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите получить дельту данных
У меня есть две банки в которые насыпано много чего. Помогите мне получить дельту этих банок. Структура банок совершенно одинаковая. Сможете?

Ну, откуда же нам знать, какой признак (значение поля) отвечает за то, что данный договор относится к маю или июню? Откуда нам знать, по каким признакам Вы собираетесь определять, что договор за май входящий в таблицу за июнь уже есть или его нет в таблице за май? Что является уникальным идентификатором записи и есть ли он вообще?

Вопросов "вагон и маленькая тележка".

Поскольку Вам подобные вопросы даже в голову не пришли, то Вас и просили предоставить пример ДАННЫХ. Чтобы Вы просто "ткнули пальцем": вот такие записи есть в первой таблице, вот такие во второй. В результате должны остаться вот эти записи.
...
Рейтинг: 0 / 0
03.08.2007, 06:41
    #34702935
Repz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите получить дельту данных
здравствуйте уважаемые,
есть похожая задача...
формулировка

есть таблицы table1 и table2
структура таблиц одинаковая
например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE TABLE table1
(
id      NUMBER( 4 ),
name character( 10 ),
date_s date
)

CREATE TABLE table2
(
id      NUMBER( 4 ),
name character( 10 ),
date_s date
)

CREATE TABLE table3
(
id      NUMBER( 4 ),
name character( 10 ),
date_s date
)



необходимо вывести в таблицу table3 (с точно такой же структурой), данные переносятся при удовлетворении след. условий:
1. запись есть в таблице 2, но ее нет в таблице 1 (т.е. просто table2 minus table1)
2. запись сравниваеться по всем полям, при малейшем отличии считать ее другой записью...

ps задача в оракле решаеться просто ... но в фокс про нет операции MINUS
...
Рейтинг: 0 / 0
03.08.2007, 06:47
    #34702938
помогите получить дельту данных
ВладимирМУ меня есть две банки в которые насыпано много чего. Помогите мне получить дельту этих банок. Структура банок совершенно одинаковая. Сможете?

Ну, откуда же нам знать, какой признак (значение поля) отвечает за то, что данный договор относится к маю или июню? Откуда нам знать, по каким признакам Вы собираетесь определять, что договор за май входящий в таблицу за июнь уже есть или его нет в таблице за май? Что является уникальным идентификатором записи и есть ли он вообще?

Вопросов "вагон и маленькая тележка".

Поскольку Вам подобные вопросы даже в голову не пришли, то Вас и просили предоставить пример ДАННЫХ. Чтобы Вы просто "ткнули пальцем": вот такие записи есть в первой таблице, вот такие во второй. В результате должны остаться вот эти записи.
Ну зачем Вы так... Судя по представленной таблице - это какая-то из "больших" СУБД. Тогда, может человеку нужен простой MINUS этих таблиц:
Код: plaintext
1.
2.
3.
select a.* from dogovor_iun a 
minus 
select b.* from dogovor_may b
Правда, тогда сервер БД должен поддерживать эту операцию (MINUS)....

P.S. Только тогда абсолютно непонятно, почему человек обратился к Лисоводам, а не на соответсвующий форум...
...
Рейтинг: 0 / 0
03.08.2007, 06:56
    #34702945
Repz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите получить дельту данных
Станислав С...кий
P.S. Только тогда абсолютно непонятно, почему человек обратился к Лисоводам, а не на соответсвующий форум...

а мне надо в фоксе
...
Рейтинг: 0 / 0
03.08.2007, 07:26
    #34702961
помогите получить дельту данных
Repzздравствуйте уважаемые,
есть похожая задача...
формулировка

есть таблицы table1 и table2
структура таблиц одинаковая
например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE TABLE table1
(
id      NUMBER( 4 ),
name character( 10 ),
date_s date
)

CREATE TABLE table2
(
id      NUMBER( 4 ),
name character( 10 ),
date_s date
)

CREATE TABLE table3
(
id      NUMBER( 4 ),
name character( 10 ),
date_s date
)



необходимо вывести в таблицу table3 (с точно такой же структурой), данные переносятся при удовлетворении след. условий:
1. запись есть в таблице 2, но ее нет в таблице 1 (т.е. просто table2 minus table1)
2. запись сравниваеться по всем полям, при малейшем отличии считать ее другой записью...

ps задача в оракле решаеться просто ... но в фокс про нет операции MINUS
Нет - это не значит невозможно... Надо простьо подумать как выкрутиться...
Например:
- сделать LEFT OUTER JOIN и отметить некоторым признаком (полем) те записи, которые одинаковые.
- Отобрать те записи, у которых признак отсутствует...

Пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
CREATE TABLE table2 ;
( ;
id      NUMBER( 4 ),;
name character( 10 ),;
date_s date;
)

CREATE TABLE table1 ;
( ;
id      NUMBER( 4 ),;
name character( 10 ),;
date_s date;
)

insert into table1 values ( 1234 ,'asdfghjkl',{^ 2007 - 01 - 01 })
insert into table1 values ( 1234 ,'asdfghjkww',{^ 2007 - 01 - 01 })
insert into table1 values ( 1235 ,'asdfghjkl',{^ 2007 - 01 - 10 })

insert into table2 values ( 1234 ,'asdfghjkl',{^ 2007 - 01 - 01 })
insert into table2 values ( 1243 ,'asdfghjkl',{^ 2007 - 01 - 01 })

select t1.id,t1.name,t1.date_s, NVL(t2.name," ") as priznak ;
from (table1 as t1 left join table2 as t2 on (t1.id=t2.id and t1.name=t2.name ;
and t1.date_s=t2.date_s) ) ;
having empty(priznak) ;
into cursor table3
brow norm
...
Рейтинг: 0 / 0
03.08.2007, 07:31
    #34702966
помогите получить дельту данных
Станислав С...кий
Пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
CREATE TABLE table2 ;
( ;
id      NUMBER( 4 ),;
name character( 10 ),;
date_s date;
)

CREATE TABLE table1 ;
( ;
id      NUMBER( 4 ),;
name character( 10 ),;
date_s date;
)

insert into table1 values ( 1234 ,'asdfghjkl',{^ 2007 - 01 - 01 })
insert into table1 values ( 1234 ,'asdfghjkww',{^ 2007 - 01 - 01 })
insert into table1 values ( 1235 ,'asdfghjkl',{^ 2007 - 01 - 10 })

insert into table2 values ( 1234 ,'asdfghjkl',{^ 2007 - 01 - 01 })
insert into table2 values ( 1243 ,'asdfghjkl',{^ 2007 - 01 - 01 })

select t1.id,t1.name,t1.date_s, NVL(t2.name," ") as priznak ;
from (table1 as t1 left join table2 as t2 on (t1.id=t2.id and t1.name=t2.name ;
and t1.date_s=t2.date_s) ) ;
having empty(priznak) ;
into cursor table3
brow norm

Пример выводит записи из таблицы1, которых нет в таблице2.
...
Рейтинг: 0 / 0
03.08.2007, 12:55
    #34703831
Repz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите получить дельту данных
спасибо огромное за наводку ...
а можно сделать чтобы структура таблиц (названия полей) не имела значения (полей просто там много ... порядка 40 - описывать и сопровождать будет проблемно) ?
...
Рейтинг: 0 / 0
03.08.2007, 12:55
    #34703833
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите получить дельту данных
Repzнеобходимо вывести в таблицу table3 (с точно такой же структурой), данные переносятся при удовлетворении след. условий:
1. запись есть в таблице 2, но ее нет в таблице 1 (т.е. просто table2 minus table1)
2. запись сравниваеться по всем полям, при малейшем отличии считать ее другой записью...

ps задача в оракле решаеться просто ... но в фокс про нет операции MINUS
По английски это звучит примерно как "NOT IN" или "NOT EXISTS". Ну, и используй соответсвующие опции!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT ;
	id, ;
	name, ;
	date ;
FROM Table2 ;
WHERE NOT EXISTS(SELECT "x" FROM Table1 ;
		WHERE ;
			Table1.id=Table2.id ;
			AND Table1.name=Table2.name ;
			AND Table1.date=Table2.date ;
		)

Правда, подобный запрос предполагает, что ни одно из полей ни в одной из таблиц не может принимать значение NULL. Хотя, если считать что NULL в одной таблице не равен NULL в другой таблице, то и в этом случае все будет корректно.
...
Рейтинг: 0 / 0
03.08.2007, 13:51
    #34704071
Repz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите получить дельту данных
к огромному сожалению в полях есть NULL значения,
и это нельзя считать изменениями ...
как быть ? NVL в подзапросе выдает ошибку ...
...
Рейтинг: 0 / 0
03.08.2007, 13:57
    #34704092
помогите получить дельту данных
Repzк огромному сожалению в полях есть NULL значения,
и это нельзя считать изменениями ...
как быть ? NVL в подзапросе выдает ошибку ...
Сделать через промежуточную таблицу/курсор. Т.е. сначала выбираем записи в курсор, затем используем курсор в последующих запросах...
...
Рейтинг: 0 / 0
03.08.2007, 14:29
    #34704205
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите получить дельту данных
Repzк огромному сожалению в полях есть NULL значения,
и это нельзя считать изменениями ...
как быть ? NVL в подзапросе выдает ошибку ...
Какая же у Вас версия FoxPro? NVL() была введена с VFP3. Или Вы ее как-то некорректно используете? Впрочем, можно написать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT ;
	id, ;
	name, ;
	date ;
FROM Table2 ;
WHERE NOT EXISTS(SELECT "x" FROM Table1 ;
		WHERE ;
		(Table1.id=Table2.id OR (Table1.id IS NULL AND Table2.id IS NULL));
		AND ;
		(Table1.name=Table2.name OR (Table1.name IS NULL AND Table2.name IS NULL));
		AND ;
		(Table1.date=Table2.date OR (Table1.date IS NULL AND Table2.date IS NULL));
		)

Или вместо

Table1.id IS NULL

Использовать

IsNull(Table1.id)
...
Рейтинг: 0 / 0
03.08.2007, 14:40
    #34704232
Repz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите получить дельту данных
ВладимирМ
...
IsNull(Table1.id)

получаем ту же ошибку SQL: Error Correlation Fields

по решению с выборкой в курсоры, так тоже не получиться ...
потому что
1. делаем курсоры с nvl по всем полям для table1 и table2
2. применяем к таблицам решение уважаемого "ВладимирМ"
3. в результате получаем разрушенную таблицу разниц (дельту) по сути (так как все null убиты NVL)

уважаемые коллеги... есть другое решение ...
может стоит написать функцию которая по таблице динамически сгенерит перечень значений через запятую ? и просто сравнить значения в псевдостолбцах ?

но к сожалению не бум бум в фоксе - поэтому не могу даже сказать как динамически это генерить
...
Рейтинг: 0 / 0
03.08.2007, 14:52
    #34704267
помогите получить дельту данных
Repz ВладимирМ
...
IsNull(Table1.id)

получаем ту же ошибку SQL: Error Correlation Fields

по решению с выборкой в курсоры, так тоже не получиться ...
потому что
1. делаем курсоры с nvl по всем полям для table1 и table2

Это Вы сами придумали. Мы с ВладимиромМ об этом не говорили

Repz
2. применяем к таблицам решение уважаемого "ВладимирМ"
3. в результате получаем разрушенную таблицу разниц (дельту) по сути (так как все null убиты NVL)

В моем решении выдавался один лишний столбец, у ВладимираМ лишних столбцов нет. И структура данных сохраняется...

Repz
уважаемые коллеги... есть другое решение ...
может стоит написать функцию которая по таблице динамически сгенерит перечень значений через запятую ? и просто сравнить значения в псевдостолбцах ?

но к сожалению не бум бум в фоксе - поэтому не могу даже сказать как динамически это генерить
А не проще будет генерировать динамически строку запроса и выполнять его через макроподстановку?
...
Рейтинг: 0 / 0
03.08.2007, 14:52
    #34704271
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите получить дельту данных
Repz ВладимирМ
...
IsNull(Table1.id)

получаем ту же ошибку SQL: Error Correlation Fields
А синтаксис

Table1.id IS NULL

работает? Какая у Вас версия FoxPro?

Repzуважаемые коллеги... есть другое решение ...
может стоит написать функцию которая по таблице динамически сгенерит перечень значений через запятую ? и просто сравнить значения в псевдостолбцах ?
Вам же надо сравнить значение не одного поля, а ВСЕХ полей. Как Вы сформируете списки в этом случае?

Если по каждому полю в отдельности, то факт того, что значение первого поля есть в списке значений первого поля, а значение второго поля есть в списке значений второго поля ничего не говорит о том, присутствуют ли эти значения в одной записи или в разных.

Впрочем, такой список уже есть. Это другая таблица. Можно вместо запроса выполнять сканирование. Хотя это сильно замедлит процесс.

Впрочем, можно сделать кобинацию запроса и сканирования. Коррелированный запрос по NOT EXISTS автоматически включит в результат выборки все записи имеющие хотя бы в одном поле значение NULL. Затем выполнить поиск (сканирование) только среди записей с NULL значениями на предмет их существования и удалить лишние.
...
Рейтинг: 0 / 0
06.08.2007, 09:05
    #34706768
Repz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите получить дельту данных
ВладимирМ
А синтаксис

Table1.id IS NULL

работает? Какая у Вас версия FoxPro?


Работает ... работаем на FoxPro 9.0
...
Рейтинг: 0 / 0
14.08.2007, 10:02
    #34725456
Repz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите получить дельту данных
задачу все еще не получается решить ...
вопрос закономерный - можно как либо подсчитать некоторую контрольную сумму всего кортежа ?
...
Рейтинг: 0 / 0
14.08.2007, 10:10
    #34725486
помогите получить дельту данных
можно как либо подсчитать некоторую контрольную сумму всего кортежа ?
А зачем для сравнения записей контрольная сумма? Она ведь может повторяться у разных записей?

Короче, лучше прямого сравнения полей ничего не придумано.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / помогите получить дельту данных / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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