Страница 1 из 1

Опять про таблицы в памяти

Добавлено: 13 сен 2005, 12:25
Alexx
Добрый день!
Дано: есть 2 таблицы в памяти,которые наполнены данными. Кол-во записей в каждой таблице может быть произвольным. Необходимо из них сформировать 3-ю таблицу, т.е. склеить их.
Например:
TABLE1
а1 b1
а2 b2
а3 b3

TABLE2
c1 d1
c2 d2
c3 d3
c4 d4
c5 d5

Итог должен быть таким:
TABLE3
а1 b1 c1 d1
а2 b2 c2 d2
а3 b3 c3 d3
c4 d4
c5 d5
Т.е. поля в итоговой таблице в которых нет данных из исходной должны быть пустыми.

Заранее, спасибо!

Добавлено: 13 сен 2005, 13:45
Johny
я бы написал так:

if (modifier GetFirst Table1)=tsOK then //спозиционировался на первую запись
begin
do
{
Insert Table3
set
Field1:=Table1.Field1,
Field2:=Table1.Filed2,
.....
FieldN:=Table1.FiledN,
} while (modifier GetNext Table1)=tsOK; //встал на следующую, если реально
end;

if (modifier GetFirst Table2)=tsOK then
begin
do
{
Insert Table3
set
Field1:=Table2.Field1,
Field2:=Table2.Filed2,
.....
FieldN:=Table2.FiledN,
} while (modifier GetNext Table2)=tsOK;
end;

Добавлено: 13 сен 2005, 13:55
Alexx
Нет, я про другое говорил. Необходимо склеить таблицы не последовательно, а параллельно.

Добавлено: 13 сен 2005, 14:21
Johny
Тогда вопрос следущий, какой логикой связаны эти таблицы? Просто первая строка первой-> первая строка второй?

if (modifier GetFirst Table2)=tsOK then
begin
modifier GetFirst Table3;
do
{
Update current Table3
set
Field1:=Table2.Field1,
Field2:=Table2.Filed2,
.....
FieldN:=Table2.FiledN;
modifier GetNext Table3;
} while (modifier GetNext Table2)=tsOK;
end;

Думаю написать что-то такое вместо второго блока.
Только тут трабла, если вторая табла больше будет.

ПОэтому я бы писал вообще проверку на то, какой цикл запускать сначала. Сначала должен идти по большей табле всегда.

Пишу на коленке, поэтому могут быть недочеты.

Добавлено: 13 сен 2005, 18:15
edward_K
insert into table3 as select
поля из table1,table2 сответсвующие по кол-ву,типу table3
where (( table1.nrec == table2.nrec )) ;

пример
insert into saldofnd
select
0,
saldomc.ATL_LASTDATE,saldomc.ATL_LASTTIME,saldomc.ATL_LASTUSER,saldomc.ATL_ORIGINOFFICE,
saldomc.LASTUSER,saldomc.LASTTIME,saldomc.LASTDATE,saldomc.FILIALNO,
saldomc.sp,saldomc.cmc,saldomc.cpodr,saldomc.cmol,saldomc.cparty,saldomc.cval
where ((1006000104 == katmc.barkod and 0 == saldomc.sp and katmc.nrec == saldomc.cmc and 0<< saldomc.cpodr )) ;