powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / как обьединить таблицы чтобы не повторялись записи
36 сообщений из 36, показаны все 2 страниц
как обьединить таблицы чтобы не повторялись записи
    #39937181
hOlushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
здраствуйте, я новичок. читаю форумы, но нигде не могу найти такое решение: есть две таблицы дебет и кредит. делаю
SELECT vr_k.*, vr_d.* FROM vr_k left JOIN vr_d ON vr_d.tnom=vr_k.tnom INTO CURSOR vr_o READWRITE ORDER BY 1
у меня получается дублируются записи. как сделать так, чтобы они были по одной? т.е. если строк дебета больше, чем кредита, то в кредите пусть будет пусто и наоборот.
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39937182
hOlushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
упор на колонку sm_k и sm_d
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39937374
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hOlushka,

Репо-данные приведите, как должно выглядеть, то самому писАть код ломает.
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39937687
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В качестве аналогии работы объединение по Join можно использовать вложенные циклы. Т.е. внешний цикл по первой таблице, а для каждой записи внутри цикла делается внутренний цикл по второй таблице с наложенным фильтром в виде условия объединения

Предположим, у Вас по дебету есть 3 записи с одним и тем же значением поля tnom, а по кредиту таких записей 2. Представьте себе, что произойдет, если применить аналогию вложенных циклов

1. Берем первую запись со значением tnom = 1846
2. Организуем перебор записей по второй таблице с тем же значением tnom = 1846. Таких записей 2. Т.е. получили 2 записи в выборке
3. Берем вторую запись со значением tnom = 1846
4. Организуем перебор записей по второй таблице с тем же значением tnom = 1846. Получаем те же самые записи, что были на шаге 2. Т.е. имеем дубль
5. Берем третью запись со значением tnom = 1846
6. Организуем перебор записей по второй таблице с тем же значением tnom = 1846. Получаем те же самые записи, что были на шаге 2. Т.е. имеем еще один дубль


В целом, в результирующей таблице будет произведение количества записей с одинаковым условием объединения. 3 записи в первой таблице умножаем на 2 записи во второй. В результирующей имеем 3*2 = 6 записей

Как исключить дубли? Есть 2 варианта решения

1. Исключить дубли до выборки. Т.е. сначала по каждой таблице в отдельности сделать выборку с группировкой по полю tnom и суммированием остальных полей. А затем объединить уже эти две выборки, зная, что дублей в них нет

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
* Исключаем дубли
SELECT vr_d.tnom, sum(vr_d.Sm_d) as Sm_d FROM vr_d INTO CURSOR vr_d_1 NOFILTER GROUP BY vr_d.tnom
SELECT vr_k.tnom, sum(vr_k.Sm_k) as Sm_k FROM vr_k INTO CURSOR vr_k_1 NOFILTER GROUP BY vr_k.tnom

* Объединяем предварительные выборки
SELECT nvl(vr_d_1.tnom, vr_k_1.tnom) as tnom, ;
	vr_d_1.Sm_d, ;
	vr_k_1.Sm_k ;
FROM vr_d_1 ;
FULL JOIN vr_k_1 ON vr_d_1.tnom = vr_k_1.tnom ;
INTO CURSOR vr_o READWRITE ;
ORDER BY 1



FULL JOIN - это как раз чтобы было "и наоборот"...

2. Надо включить в условие объединения другие поля, которые позволят однозначно определить какую запись одной таблицы следует сопоставить с какой записью второй таблицы. Но это не всегда возможно. Насколько я вижу по картинке, здесь такой вариант невозможен


Если же у Вас стоит задача просто "сложить" две таблички "как в Excel" (два листа рядом положить), то в FoxPro через Select-SQL это невозможно. Такое придется делать "вручную" именно что через вложенные циклы.
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39937725
hOlushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, спасибо за подробный ответ. Я в общем то похожее и делала, искала повторяющуюся запись и просто удаляла ее... а хотелось как в экселе)... в вашем примере плохо то, что там суммируются данные, а мне надо по каждой сумме отдельно.
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39937726
hOlushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist, вот примерно так
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39937727
hOlushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938636
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если все поля повторяющихся записей одинаковые, то просто добавьте Distinct в итоговую выборку.
Например, если у вас таблица table1 с содержимым:
name agevasia 18petia 20inna 54vasia 18inna 54

Код: sql
1.
Select Distinct name, age from table1 into table result


вернет вам:
name agevasia 18petia 20inna 54
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938679
hOlushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
faustgreen,

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

Попробуйте разобраться с командой select и понять как производится выборка и объединение, чтобы вы могли самостоятельно анализировать ваши данные (Если найдете материал подходящий, то думаю займет не более недели, а может и меньше).

вот тут посмотрите картинку с типами объединения -
( https://data-lessons.github.io/gapminder-R/12-joins.html)
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938692
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если хотите могу попробовать написать запрос. Покажите, что у вас лежит в таблице vr_k и таблице vr_d (все данные не нужно, только те, где tnom = 1846). Желательно с фамилиями - можете их заменить на псевдонимы.
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938704
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отмена, можете не сбрасывать данные. У вас там получается, что в первой таблице 2 записи с tnom = 1846, а во второй 3 записи с tnom = 1846. Немного стало понятно, что вы хотите сделать, но не понятно, зачем такое объединение.
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938708
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В первой таблице у вас есть:
tnomsm_k1846 476.751846 40.14

во второй:
tnomsm_d1846 21.791846 18.161846 0.19

другие поля и данные опустим. для всех типов объединений у вас получится одинаковый результат:

tnom_a sm_k tnom_b sm_d 1846 476.75 1846 21.791846 476.75 1846 18.161846 476.75 1846 0.191846 40.14 1846 21.791846 40.14 1846 18.161846 40.14 1846 0.19
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938715
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Вы наверное хотите получить такой результат?:
tnom_a sm_k tnom_b sm_d1846 476.75 1846 21.791846 40.14 1846 18.161846 0 1846 0.19
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938718
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО тут SQL не уместен, исходные данные не нормализованы.
Надо создавать таблицу под результат, делать скан исходных таблиц и заполнять результирующую.
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938719
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максимум что можно - слить в одну таблицу с помощью UNION и дальше с ней работать
Код: sql
1.
2.
3.
select tnom, sm_k, 0 as sm_d from t1;
    union all (select tnom, 0 as sm_k, sm_d from t2);
    order by tnom
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938721
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно Вы выбрали неправильный способ решения задачи. Вверху Вы написали про Excel и пытаетесь переложить его функционал на таблицу Foxpro, а они немного отличаются, и то, что подходит для Excel, может не подойти для Foxpro.

Напишите, что вы хотите сделать с итоговыми данными, и возможно вам тут подскажут как это сделать средствами Foxpro.
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938725
hOlushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по типам объединения мне подходит full join, но он почему то не срабатывает и записи дублируются. а ключ там только один это табельный номер tnom
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938727
hOlushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
faustgreen, такое обьединение мне нужно для вывода отчета
в один курсор а потом либо в эксель либо в репорт фоксовский одни махом, как говорится
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938730
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hOlushka
по типам объединения мне подходит full join, но он почему то не срабатывает и записи дублируются

Потому что он тебе не подходит и работает так как должен работать 22099572
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938731
hOlushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
faustgreen
А Вы наверное хотите получить такой результат?:
tnom_a sm_k tnom_b sm_d1846 476.75 1846 21.791846 40.14 1846 18.161846 0 1846 0.19

да, именно это мне и надо. это все делается в foxpro. про эксель я написала, чтоб для примера как хотелось бы...
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938732
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hOlushka
по типам объединения мне подходит full join, но он почему то не срабатывает и записи дублируются. а ключ там только один это табельный номер tnom


Он срабатывает, но только не так, как вы ожидаете. Это то что я писал выше про Excel. Так если вы привыкли забивать гвозди молотком, а потом вам дают шурупы(которые вроде как похожи на гвозди), вам не надо их забивать, а нужно взять отвертку.

Что вы хотите сделать с итоговой таблицей:Вывести в отчет ? Показать пользователю на форме или что то еще ?
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938739
hOlushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
faustgreen,да, вывести в отчет
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938747
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hOlushka
faustgreen,да, вывести в отчет

Я обычно в Excel вывожу. Для вашего примера сделал бы следующее:
1). Получил бы набор уникальных tnom:
Код: sql
1.
select tnom from vr_k union select tnom from vr_d into table table1


2). Потом используя scan по таблице table1 выводил бы данные в отчет:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select table1
scan
   lcCurrentTNOM = table1.tnom
   select * from vr_k where tnom = lcCurrentTNOM into cursor firstPart
       if !empty(_tally)
           * вставляем данные в нужные строки.
       endif 
   select * from vr_d where tnom = lcCurrentTNOM into cursor secondPart
       if !empty(_tally)
           * вставляем данные в нужные строки.
       endif 
endscan 
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938758
hOlushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
faustgreen
hOlushka
faustgreen,да, вывести в отчет

Я обычно в Excel вывожу. Для вашего примера сделал бы следующее:
1). Получил бы набор уникальных tnom:
Код: sql
1.
select tnom from vr_k union select tnom from vr_d into table table1


2). Потом используя scan по таблице table1 выводил бы данные в отчет:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select table1
scan
   lcCurrentTNOM = table1.tnom
   select * from vr_k where tnom = lcCurrentTNOM into cursor firstPart
       if !empty(_tally)
           * вставляем данные в нужные строки.
       endif 
   select * from vr_d where tnom = lcCurrentTNOM into cursor secondPart
       if !empty(_tally)
           * вставляем данные в нужные строки.
       endif 
endscan 


извините за назойливость, но * вставляем данные в нужные строки. это куда именно? в какойто промежуточный курсор? и если будет 2 строки с одинаковым tnom но с разными суммами?
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938763
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это набросок, может где-то ошибся:
Код: sql
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
select table1
HEADER_SIZE = 3 && Задаем размер шапки отчета.
lnCurrentRow = HEADER_SIZE + 1 && Счетчик строк.
scan
   lcCurrentTNOM = table1.tnom
   select * from vr_k where tnom = lcCurrentTNOM into cursor firstPart
       lnSize1 =  _tally
       if !empty(lnSize1)
           * вставляем данные в нужные строки.
           seelct firstPart
           i = 0
           scan
                 i = i + 1;
                 lnTnom = firstPart.tnom
                 lnSmK   = firstPart.sm_k
                 ....
                  m.XLSheet.Cells(lnCurrentRow + i, 1).Value = lnTnom 
                  m.XLSheet.Cells(lnCurrentRow + i, 2).Value = lnSmK
                  ....
           endscan
       endif 
   select * from vr_d where tnom = lcCurrentTNOM into cursor secondPart
       lnSize2 =  _tally
       if !empty(lnSize2)
           * вставляем данные в нужные строки.
           seelct secondPart
           i = 0
           scan
                 i = i + 1;
                 lnTnom = secondPart.tnom
                 lnSmD  = secondPart.sm_D
                 ....
                  m.XLSheet.Cells(lnCurrentRow + i, 1).Value = lnTnom 
                  m.XLSheet.Cells(lnCurrentRow + i, 2).Value = lnSmD
                  ...
           endscan
       endif 
       if lnSize1>lnSize2
          lnCurrentRow = lnCurrentRow + lnSize1
      else 
          lnCurrentRow = lnCurrentRow + lnSize2      
      endif 
endscan 
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938766
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не знаете как работать с Excel из FoxPro, посмотрите например в книге Visual FoxPro 9.0. . Или погуглите в сети.
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938771
hOlushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
faustgreen, спасибо большое, буду пробовать и изучать)
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938772
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вам простой пример, который вы можете скопировать и запустить:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
OEXCEL = CREATEOBJECT("Excel.Application")  && Создается объект Excel.

OEXCEL.VISIBLE = .T.                                                   && Делаем Excel видимым.
OEXCEL.WORKBOOKS.ADD                                            && Добавляем новую книгу. 
OEXCEL.DISPLAYALERTS = .F.                                       && Отключаем предупреждения.  

OEXCEL.SHEETS(1).SELECT                                            && Выбираем первый лист.

OEXCEL.CELLS(1,1).Value = "Hello"                                 && В ячейку 1:1 (Строка 1- колонка 1) выводим текст "Hello"
OEXCEL.CELLS(1,2).Value = "Hello"
OEXCEL.CELLS(1,3).Value = "Hello"
OEXCEL.CELLS(1,4).Value = 1
OEXCEL.CELLS(1,5).Value = 2
OEXCEL.CELLS(1,6).Value = 3



Он довольно примитивный, но вы так быстрее поймете суть, ну а дальше копайте ...
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938779
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант, чтобы получить полноценный ключ, добавить поле с номером записи row
tnomrowsm_k18461476.751846240.14

во второй:
tnomrowsm_d1846121.791846218.16184630.19
т.е. row внутри каждого значения tnom начинается с 1

Тогда
Код: sql
1.
FULL JOIN t1.tnom = t2.tnom and t1.row = t2.row


даст то что требуется
hOlushka
faustgreen
А Вы наверное хотите получить такой результат?:
tnom_a sm_k tnom_b sm_d1846 476.75 1846 21.791846 40.14 1846 18.161846 0 1846 0.19

да, именно это мне и надо. это все делается в foxpro. про эксель я написала, чтоб для примера как хотелось бы...
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938792
hOlushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Как вариант, чтобы получить полноценный ключ, добавить поле с номером записи row
tnomrowsm_k18461476.751846240.14


во второй:
tnomrowsm_d1846121.791846218.16184630.19
т.е. row внутри каждого значения tnom начинается с 1

Тогда
Код: sql
1.
FULL JOIN t1.tnom = t2.tnom and t1.row = t2.row


даст то что требуется
hOlushka
пропущено...

да, именно это мне и надо. это все делается в foxpro. про эксель я написала, чтоб для примера как хотелось бы...



вот что олучается, тогда надо id и tnom чтобы были одинаковые у двух таблиц... я так понимаю, связать их.....
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938797
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hOlushka, Вы неправильно поняли, Dima T, предлагал проставить ID не для всей таблицы, а для каждого tnom:
tnom id1486 11486 21486 31503 11503 21556 11600 11600 21600 31600 4
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938799
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hOlushka
вот что олучается, тогда надо id и tnom чтобы были одинаковые у двух таблиц... я так понимаю, связать их.....

Внимательнее читать надо, я же писал "row внутри каждого значения tnom начинается с 1"

т.е. так
tnomrowsm_k18461476.751846240.14 304815.403048228.804024112.30
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938800
hOlushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
hOlushka
вот что олучается, тогда надо id и tnom чтобы были одинаковые у двух таблиц... я так понимаю, связать их.....

Внимательнее читать надо, я же писал "row внутри каждого значения tnom начинается с 1"

т.е. так
tnomrowsm_k18461476.751846240.14 304815.403048228.804024112.30

ой, не внимательно, точно... помню такое было... счас поробую.
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938819
hOlushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем ОГРОМНОЕ СПАСИБО!!! все получилось. вот результат. То, что мне и надо было.
...
Рейтинг: 0 / 0
как обьединить таблицы чтобы не повторялись записи
    #39938820
hOlushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / как обьединить таблицы чтобы не повторялись записи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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