powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос с самообъединением и условием по датам
11 сообщений из 11, страница 1 из 1
Запрос с самообъединением и условием по датам
    #32790843
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите как возможно написать запрос без создания темповых таблиц.
Проблема в следующем. Немного истории, раньше база работала так.

Раньше:
Каждый день закачивалась в базу новая таблица и мы имели след. исходные данные (в упрощенном виде):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
         [Tab1]                 [Tab2]
ddate     kod   saldo   ddate     kod   saldo
---------------------   ---------------------
 01 . 01 . 04     1      5 , 00      02 . 01 . 04     1      5 , 99 
 01 . 01 . 04     2      3 , 05                   
 01 . 01 . 04     3      2 , 40      02 . 01 . 04     3      2 , 40  
                         02 . 01 . 04     4      7 , 01  
                         02 . 01 . 04     5      8 , 01   
Т.е. в таблице Tab2 появляются какие-то новые записи, а некоторые старые наоборот могут исчезать.

Задача - Отобрать все новые записи из Tab2, а также совпавшие Tab1.kod=Tab2.kod, у которые несовпадают saldo (Tab1.saldo<>Tab2.saldo)
Т.е.:
Код: plaintext
1.
2.
3.
4.
5.
6.
                     [Tab3]     
T1.ddate T1.kod T1.saldo  T2.ddate T2.kod  T2.saldo
----------------------------------------------------
 01 . 01 . 04      3       2 , 40      02 . 01 . 04     3        2 , 40  
                           02 . 01 . 04     4        7 , 01  
                           02 . 01 . 04     5        8 , 01   

В случае двух разных таблиц это достигается простым LEFT JOIN с доп. условием WHERE:
Код: plaintext
1.
2.
3.
SELECT Tab1.*, Tab2.*
FROM Tab2 LEFT JOIN Tab1 ON Tab1.kod=Tab2.kod
WHERE (Tab2.saldo<>Tab1.saldo) OR (Tab1.kod IS NULL)

Теперь:
Закачка идет в одну таблицу и вместо двух таблиц мы имеем одну общую, в которой храняться данные по всем прошедшим дням:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
         [Tab4]             
ddate     kod   saldo
---------------------
 01 . 01 . 04     1      5 , 00     
 01 . 01 . 04     2      3 , 05                   
 01 . 01 . 04     3      2 , 40     
 02 . 01 . 04     1      5 , 99 
 02 . 01 . 04     3      2 , 40  
 02 . 01 . 04     4      7 , 01  
 02 . 01 . 04     5      8 , 01   
 03 . 01 . 04  ......   
 03 . 01 . 04  ......   
.....
 04 . 01 . 04  ......   
 04 . 01 . 04  ......   
.....
и т.д.  

Задача остается той же. Получить надо такую же Tab3, задавая любые две даты.

Как я не мучился, у меня что-то никак не получилось составить SQL запрос чтобы и по датам отобрать и еще внешнее левое объединение сделать. Я пытался писать что-то типа такого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT Tab4.*, Tab4_2.*
FROM Tab4 LEFT JOIN Tab4 AS Tab4_2 ON Tab4.kod=Tab4_2.kod
WHERE Tab4.ddate=# 01 / 02 / 04 # AND Tab4_2.ddate=# 01 / 01 / 04 #

' при этом where пропадают новые записи за 01/02/04(амер. формат даты), ведь у них Tab4_2.ddate = NULL
' пытаемся добавить и это условие
...
WHERE (Tab4.ddate=# 01 / 02 / 04 # AND (Tab4_2.ddate=# 01 / 01 / 04 # OR Tab4_2.ddate = NULL)
' это не помогает... я уже не говорю про условие еще по полю saldo

Я так понимаю, что через самообъединение не получится.. копать в другую сторону, может через FROM (SELECT), какие у кого мысли?
...
Рейтинг: 0 / 0
Запрос с самообъединением и условием по датам
    #32791023
Фотография Shurgenz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
select * from
Tab4 as a INNER JOIN Tab4 AS b ON (a.kod=b.kod and a.saldo<>b.saldo and b.ddate>=a.ddate) or (b.ddate>=a.ddate and a.kod<>b.kod)
WHERE a.ddate = # 01 / 01 / 04 # and b.ddate < # 01 / 03 / 04 #

может, что-нибудь типа такого прокатит? не очень врубился в задачу... признаюсь честно
...
Рейтинг: 0 / 0
Запрос с самообъединением и условием по датам
    #32791050
Фотография Ирча
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А 3 запросами?
...
Рейтинг: 0 / 0
Запрос с самообъединением и условием по датам
    #32791084
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раньше было совсем плохо...

По текущей ситуации, перефразирую для себя:

Есть таблица Tab4
ddate kod saldo01.01.04 1 5.00 01.01.04 2 3.05 01.01.04 3 2.40 02.01.04 1 5.9902.01.04 3 2.40 02.01.04 4 7.01 02.01.04 5 8.01

Надо выбрать записи за период, по одной для каждого кода, с минимальной датой, если код встречается несколько раз?
...
Рейтинг: 0 / 0
Запрос с самообъединением и условием по датам
    #32791103
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
select *
from tab4
     left join tab4 as t on on ((tab4.ddate<t.ddate) and (tab4.kod=t.kod) and
           (t.ddate between [Дата начала периода] and [Дата окончания периода]))
where tab4.ddate between [Дата начала периода] and [Дата окончания периода] 
      and t.kod is null
Примерно так (не проверяю). По форуму есть еще куча вариантов. Обычно аналогичный запрос требуется для поиска последней цены товара.
...
Рейтинг: 0 / 0
Запрос с самообъединением и условием по датам
    #32791113
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ирча: Так пока и работает:1,2 запроса - выборка по дате (скидывает в темп табл), 3 запрос производит сравнение

Shurgenz: в принципе хотелось бы получить запрос с возможностью задавания двух не обязательно рядом лежащих дат... но и с идее перейти на INNER и поиграть с условием ON попробую поработать
...
Рейтинг: 0 / 0
Запрос с самообъединением и условием по датам
    #32791168
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geo
Надо выбрать записи за период, по одной для каждого кода, с минимальной датой, если код встречается несколько раз?

Нет, Geo ты меня неправильно понял. Необходимо сравнить между собой только 2 дня (желательно естественно любые) - и показать:
- новые записи (тобишь новые kod, которых не было в другом дне)
- а также все старые, у которых сальдо изменилось.

Т.е. получить надо все ту же Tab3, токо если раньше у меня были две таблицы за два разных дня и пролемы их сравнения решалась простым LEFT JOIN с доп. условием, ТО теперь у меня одна таблица Tab4 и я не могу написать запрос... пока все это работает так, что из Tab4 я делаю просто выборку по дате с созданием temp. таблиц и их потом по старинке сравниваю
...
Рейтинг: 0 / 0
Запрос с самообъединением и условием по датам
    #32792232
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем я тут еще поковырялся и понял что видимо придется делать через UNION. Первый запрос по наводкам Geo и Shurgenz я сляпал. Проблемы со второй частью.

Поэтому сужаю свой вопрос и спрашиваю следующее:
Есть таблица Tab4
ddate kod saldo01.01.04 1 5.00 01.01.04 2 3.05 01.01.04 3 2.40 02.01.04 1 5.9902.01.04 3 2.40 02.01.04 4 7.01 02.01.04 5 8.01 ... .... и т.д.

Как отобрать новые записи за 02.01 которых нет за 01.01 (ключевое поле - kod)?

Я пробую через подч. запрос с NOT EXISTS и доп. условиями по датам в WHERE, но он что-то очень долго работает (дуже целый час пашет). Как лучше это осуществить, какие идеи?

Просто хотелось бы уйти от схемы с 3 запросами (2 запроса - создание темп. таблиц с записями за 01.01 и 02.01, а 3 запрос - делает Внешнее LEFT JOIN). Этоти запросы работют быстро, но... темп. таблицы...вообщем.
...
Рейтинг: 0 / 0
Запрос с самообъединением и условием по датам
    #32792290
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем все-таки создавать временные таблицы? Почему нельзя заджойнить запросы на выборку?
...
Рейтинг: 0 / 0
Запрос с самообъединением и условием по датам
    #32792306
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select t42.*
FROM
(select  ddate,kod, saldo
from table4 
where ddate=date2 ) as t42
LEFT JOIN 
(select  kod, saldo
from table4 
where ddate=date1) as t41
ON t42.kod =t41.kod and  t42.saldo <>t41.saldo
WHERE t41.kod  is null
...
Рейтинг: 0 / 0
Запрос с самообъединением и условием по датам
    #32792308
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-во...
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос с самообъединением и условием по датам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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