powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как передать дату в подчиненный запрос третьего уровня.
16 сообщений из 16, страница 1 из 1
Как передать дату в подчиненный запрос третьего уровня.
    #39979642
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеются 2 таблички:
Customer
IDTelephonePersonContractDate19001112233Иванов Иван Иванович01.01.200029001112233Петров Петр Петрович01.06.200039001112233Семенов Семен Семенович31.12.200049001112244Иванов Семен Семенович01.01.200559001112244Смирнов Иван Семенович01.05.2005
и
Detail
IDCallDateAbonentOpponentCallDuration105.06.20009013004466900111223320
Требуется для каждой строки из таблицы Detail отобразить данные из таблицы Customer где Max(Customer.ContractDate) <= Detail.CallDate
и вот тут затык, т.к. получается трехуровневый запрос, где надо передать дату с первого на третий уровень. Т.е запрос выглядеть должен примерно так:
Код: sql
1.
2.
3.
SELECT * FROM Detail
inner join (SELECT * FROM Customer as C1
                  WHERE C1.ContractDate = (SELECT Max(C2.ContractDate) AS [Max-ContractDate] FROM Customer as C2 WHERE C2.Telephone=C1.Telephone and C2.ContractDate<=Detail.CallDate GROUP BY C2.Telephone)) as C0 on C0.Telephone=Detail.Opponent;

но он не работает
И как извернуться? Использовать DLookup() категорически не хочу, для совместимости с другими диалектами SQL
...
Рейтинг: 0 / 0
Как передать дату в подчиненный запрос третьего уровня.
    #39979644
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Было умное сообщение
...
Рейтинг: 0 / 0
Как передать дату в подчиненный запрос третьего уровня.
    #39979664
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, что не решаема эта задача для Акцеса. Нет у него таких средств. Придется идти другим путем...
...
Рейтинг: 0 / 0
Как передать дату в подчиненный запрос третьего уровня.
    #39979666
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Страдалецъ
Похоже, что не решаема эта задача для Акцеса. Нет у него таких средств. Придется идти другим путем...
В принципе, решаема.
Просто, в "других диалектах SQL" это решается тривиально, с помощью оконных функций ...
А в Аксовском ANSI SQL-92 будет выглядеть немного "жутковато" :)

Код: sql
1.
2.
3.
4.
5.
6.
select * from
  (select a.ID, a.CallDate, a.Abonent, a.Opponent, a.CallDuration, max(b.ContractDate) as ContractDateMax
  from Detail a inner join Customer b on a.Telephone=b.Telephone
  where a.CallDate >= b.ContractDate
  group by a.ID, a.CallDate, a.Abonent, a.Opponent, a.CallDuration) t1
inner join Customer t2 on t1.Telephone=t2.Telephone and t1.ContractDateMax=t2.ContractDate
...
Рейтинг: 0 / 0
Как передать дату в подчиненный запрос третьего уровня.
    #39979668
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы бы показали фрагмент схемы.Я смутно подозреваю что при определенной схеме Ваша задача легко решаема.
(отдельные таблицы Person,Tlf справочники и Call главная для них)
...
Рейтинг: 0 / 0
Как передать дату в подчиненный запрос третьего уровня.
    #39979812
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, за вариант запроса. Попробую его попозже проверить. Я пока крутил это дело вдруг понял, что мне вообще можно обойтись без агрегатов. Ведь мне надо просто получить одну строчку данных, где ContractDate <= CallDate т.е.
Код: sql
1.
select top 1 * from Customer where ContractDate <= CallDate order by ContractDate desc


должна вернуть именно то что мне надо и она в тестовом запросе возвращает именно то что надо, но вот если я этот подзапрос встрою в основной, то в какой-то момент выполнения основного запроса я получаю сообщение, что этот подзапрос возвращает больше чем один результат! Как он может вернуть больше чем один результат, при явной инструкции Top 1 ?
...
Рейтинг: 0 / 0
Как передать дату в подчиненный запрос третьего уровня.
    #39979818
Страдалецъ
Требуется для каждой строки из таблицы Detail отобразить данные из таблицы Customer где Max(Customer.ContractDate) <= Detail.CallDate
1. Судя по запросу SELECT * FROM Detail... задача оисана неправильно. Видимо должно быть "из таблицы Detail отобразить данные, где CallDate >= Max(Customer.ContractDate)".
2. На 2-м и 3-м уровне у вас одна и та же таблица Customer. Зачем?
Попробуйте так:
Код: sql
1.
2.
SELECT * FROM Detail WHERE EXSISTS (SELECT Max(C2.ContractDate) FROM Customer As C2 
  WHERE C2.Telephone=Detail.Opponent GROUP BY Customer.Telephone HAVING Max(Customer.ContractDate)<=Detail.CallDate)
...
Рейтинг: 0 / 0
Как передать дату в подчиненный запрос третьего уровня.
    #39979836
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кривцов Анатолий,

Дело в том, что из таблицы Customer мне надо вернуть правильного Person и отобразить вместе с Detail.
Правильным считается Person где ContractDate <= CallDate из Detail
Т.е. есть имеем телефонные переговоры за год, а это таблица Detail и для каждого телефонного разговора надо отобразить опонента, но т.к. владельцем телефона в течении года может оказаться несколько человек, то выбрать надо только того, у которого на момент звонка был действующий договор, а это поле ContractDate из таблицы Customer
Именно это я и пытаюсь провернуть.
...
Рейтинг: 0 / 0
Как передать дату в подчиненный запрос третьего уровня.
    #39979900
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
одно из основных правил акцесса гласит:если в поле таблицы повторяются значения и это не поле связи или подстановки то такую таблицу надо разбить(можете проверить в анализе таблиц). У Вас в поле Telephone есть повторения, уверен при наполнении данными они будут и в поле Person.При вашей структуре решение простых задач будет очень проблематично или вовсе невозможно. Менять структуру или нет-Ваше личное дело.Удачи
...
Рейтинг: 0 / 0
Как передать дату в подчиненный запрос третьего уровня.
    #39979963
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как передать дату в подчиненный запрос третьего уровня.
    #39980093
Нестандартное мышление
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku,

Преобразуйте дату в UNIX time. Так значительно проще
...
Рейтинг: 0 / 0
Как передать дату в подчиненный запрос третьего уровня.
    #39980138
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил я эту задачу, пришлось идти другим путем, полностью отказавшись от агрегатов.
Код: sql
1.
select CallDate, Abonent, Opponent, (select top 1 Person from Customer where Telephone=Opponent and ContractDate<=CallDate order by ContractDate desc) as Person from Detail


Но вот для саморазвития хотелось бы понять, каким образом SQL может вернуть больше одного значения при явно заданной инструкции top 1 ?
Код: sql
1.
select Top 1 * from SomeTable
...
Рейтинг: 0 / 0
Как передать дату в подчиненный запрос третьего уровня.
    #39980202
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как передать дату в подчиненный запрос третьего уровня.
    #39980207
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нестандартное мышление
sdku,
Преобразуйте дату в UNIX time. Так значительно проще
Unix-время (англ. Unix time, также POSIX-время) — система описания моментов во времени, принятая в Unix и других POSIX-совместимых операционных системах. Определяется как количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года (четверг); этот момент называют «эпохой Unix» (англ. Unix Epoch).
И чем же это проще, а главное наглядней?
1594849217 а в "человеческом" виде это 15.07.2020, 23:40:17
...
Рейтинг: 0 / 0
Как передать дату в подчиненный запрос третьего уровня.
    #39980211
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, а Limit и аналогичные инструкции в других SQL-диалектах тоже ведут себя сходным образом? Как-то очень неожиданно узнать, что Top 3 вернет примерно 3 записи.
...
Рейтинг: 0 / 0
Как передать дату в подчиненный запрос третьего уровня.
    #39980237
Страдалецъ
Интересно, а Limit и аналогичные инструкции в других SQL-диалектах тоже ведут себя сходным образом? Как-то очень неожиданно узнать, что Top 3 вернет примерно 3 записи.
Top обычно идет в паре с order by (как у вас - вернуть запись с максимальной датой). Что бы он не возвращал лишних записей, достаточно в order by добавить ключевое или другое уникальное обязательное поле.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как передать дату в подчиненный запрос третьего уровня.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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