powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / как обьединить таблицы чтобы не повторялись записи
25 сообщений из 36, страница 1 из 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
25 сообщений из 36, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / как обьединить таблицы чтобы не повторялись записи
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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