powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / помогите совместить таблицы без декартова умножения!
7 сообщений из 7, страница 1 из 1
помогите совместить таблицы без декартова умножения!
    #38615301
Нася85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу помощи специалистов!
Надо совместить таблицы без декартова умножения!
Есть две таблицы, списки документов с их реквизитами, надо совместить таблицы по двум полям - Дата и Сумма.
Без перебора строк, в одном запросе.
У меня есть:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select  
  Поле1 as Контр
  Поле2 as НомерДок
  Дата as ДатаДок
  Сумма as СуммаДок
.....
и:

select   
  Поле3 as Контр2
  Поле4 as НомерДок2
  Дата as ДатаДок
  Сумма as СуммаДок
........



как их объединить, чтобы не раздваивались строки ни первой ни второй таблицы, а там где ДатаДок и СуммаДок совпадают -
Контр, НомерДок, ДатаДок, СуммаДок, Контр2, НомерДок2 встали в одну строку, а где не нашли для себя соответствия - было пусто. Проблема в том, что каждый документ только в одной строке должен участвовать и права и слева.
Прочитала, что можно пронумеровать строки. Это бы решило проблему, если бы можно было пронумеровать документы в пределах одного дня, тогда бы я написала FULL JOIN (таб1.ДатаДок=таб2.ДатаДок) AND (таб1.СуммаДок=таб2.СуммаДок) AND (таб1.НомерВДне=таб2.НомерВДне), но как этот номер получить?

Может есть в Фоксе аналог функции SQL: ROW_NUMBER()? Мне надо чтобы работало в OLE DB провайдере...

Буду очень благодарна за советы!
...
Рейтинг: 0 / 0
помогите совместить таблицы без декартова умножения!
    #38615319
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если пара (ДатаДок, СуммаДок) уникальны, то можно их взять за ключ.
Код: sql
1.
FULL JOIN (таб1.ДатаДок=таб2.ДатаДок) AND (таб1.СуммаДок=таб2.СуммаДок)



Нася85Может есть в Фоксе аналог функции SQL: ROW_NUMBER()? Мне надо чтобы работало в OLE DB провайдере...
Есть RECNO() но она не работает в SQL-запросах, и данные задачи обычно решают без использования SQL.

VFPOLEDB это не совсем фокс, там есть ограничения по сравнению с полноценным фоксом.
...
Рейтинг: 0 / 0
помогите совместить таблицы без декартова умножения!
    #38615332
Нася85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,
Спасибо за ответ!
В том то и дело, что не уникальны, у меня так раздваиваются документы. Надо просто найти к каждому документу продажи - одну оплату, и больше ее не использовать. И показать все оставшиеся без пар.
Recno() пробовала, там во все строки ставит одно значение 24788 - видимо последняя строка одной из обрабатываемых ранее таблиц.
...
Рейтинг: 0 / 0
помогите совместить таблицы без декартова умножения!
    #38615350
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вариант самому проставить ROW_NUMBER()
на фоксе так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select cast(0 as int) nRow, Дата, Сумма from таб1 order by Дата, Сумма into cursor t1 readwrite
lnRow = 0
ldPrevDate = {}
lnPrevSum = -1
sele t1
scan
  if ldPrevDate = t1.Дата and lnPrevSum = t1.Сумма 
    * повтор
    lnRow = lnRow + 1
    repl in t1 nRow with lnRow
  else
    ldPrevDate = t1.Дата
    lnPrevSum = t1.Сумма 
    lnRow = 0
  endif
endscan


также делаем t2
далее работаем с курсорами t1 и t2
Код: sql
1.
FULL JOIN (t1.ДатаДок=t2.ДатаДок) AND (t1.СуммаДок=t2.СуммаДок) AND (t1.nRow=t2.nRow)



Только не уверен что VFPOLEDB это поймет, попробуй
...
Рейтинг: 0 / 0
помогите совместить таблицы без декартова умножения!
    #38615352
Нася85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

спасибо, сейчас попробую!
...
Рейтинг: 0 / 0
помогите совместить таблицы без декартова умножения!
    #38615383
Нася85,
ну, наверное, можно и так:
Код: sql
1.
2.
3.
4.
5.
6.
select Контр, НомерДок, ДатаДок, СуммаДок, Контр2, НомерДок2
from таб1 left join таб2 on (таб1.ДатаДок=таб2.ДатаДок) AND (таб1.СуммаДок=таб2.СуммаДок)
union all
select null as Контр, null as НомерДок, ДатаДок, СуммаДок, Контр2, НомерДок2
from таб2 
where not exist (select ДатаДок from таб1 inner join таб2 on (таб1.ДатаДок=таб2.ДатаДок) AND (таб1.СуммаДок=таб2.СуммаДок) )



И то должна быть гарантия, что нет повторения сочетания дата документа+сумма документа....
...
Рейтинг: 0 / 0
помогите совместить таблицы без декартова умножения!
    #38615386
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав С...кий,

ты эмулятор FULL JOIN написал, только
Нася85В том то и дело, что не уникальны, у меня так раздваиваются документы.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / помогите совместить таблицы без декартова умножения!
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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