powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
10 сообщений из 10, страница 1 из 1
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
    #38545361
Kirill Frolov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть некий запрос типа SELECT uid, utime, lat, lng... FROM ... INNER JOIN ... результатом является набор полей.

Далее я делаю следующий запрос: SELECT lat, lng FROM geo WHERE user = uid AND time < utime) ORDER BY time DESC LIMIT 1.

Цель: найти наиболее последние координаты для заданного uid, за время предшествующее utime из первого запроса...

Хотелось бы два запроса объединить в один. В SQL мало что понимаю, но уже понял, что когда у меня через JOIN несколько таблиц объединяются, для извлечения единого набора полей, то вложенные запросы там не работают (в SQLite по крайней мере) для объединённой таблицы. Т.е. я не могу дописать JOIN ( SELECT lat, lng FROM geo WHERE user = uid AND time < utime ORDER BY time DESC LIMIT 1). Жирным выделены поля из внешнего запроса которые неизвестны во внутреннем. Условия нужно после оператора ON записывать. Но там я никак не смогу написать LIMIT 1. Как, спрашивается быть?

Нагуглил похожую проблему: http://www.postgresql.org/message-id/D8359135792A485BA28720B9BE7643AA@produs.ch]http://www.postgresql.org/message-id/D8359135792A485BA28720B9BE7643AA@produs.ch -- но тут всегда нужна последняя дата из t2, что и делает вложенный запрос. А мне нужна последняя с временем меньшим utime, а это самое utime не известно будет во вложенном запросе. И ещё я, кстати, не понимаю почему SQLite не понимает WHERE (field1, field2...), а понимает только WHERE (field) -- только одно поле у WHERE.

Может мой запрос с JOIN'ами завернуть в ещё один SELECT. И при этом в нём выдавать все возможные времена. А во внешнем запросе отсечь только нужное. Но может, можно проще?

Модератор: Тема перенесена из форума "Проектирование БД".
...
Рейтинг: 0 / 0
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
    #38545547
AndreiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kirill Frolov,

в 9.3 появилась новая конструкция LATERAL, как раз для таких случаев как у вас
смотреть здесь и здесь

В вашем случае скорее всего нужен запрос вида:
Код: sql
1.
2.
3.
4.
select t.*, q.*
  from t
  left join lateral (selecy a, b from t2 wher t2.t_id = t.id order by ... limit 1) as q on true
where ...


PS: проверьте наличие индекса в таблице geo по полям user и time
...
Рейтинг: 0 / 0
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
    #38545590
Kirill Frolov,

может можно и проще, но без юзабильного набора тестовых данных сильно сокращается число желающих помочь тебе в решении твоей проблемы.
...
Рейтинг: 0 / 0
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
    #38545595
AndreiSQL,

человек все время упоминает о SQLite. Насколько я помню, там нет оператора LATERAL, как и во многих других СУБД.
...
Рейтинг: 0 / 0
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
    #38545644
AndreiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - ЭхAndreiSQL,
человек все время упоминает о SQLite. Насколько я помню, там нет оператора LATERAL, как и во многих других СУБД.
тема заведена в форуме PostgreSQL, вот я и отвечаю как это в постре сделать )

В SQLite не силён, но вот здесь "Серж" утверждает, что в SQLite 3.2.5 все должно работать ;)
...
Рейтинг: 0 / 0
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
    #38545656
AndreiSQL,

в том топике речь шла за коррелированные подзапросы вообще, но не про латеральную их модификацию.
Латеральные подзапросы на сегодняшний день поддерживает MS SQL Server ([CROSS | OUTER] APPLY), Oracle (lateral join, и то только при включении определенного события - set event 22829 ), ну и PоstGre. Остальные СУБД пока нервно курят в сторонке.
...
Рейтинг: 0 / 0
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
    #38546868
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
накой тут латералы?
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT lat, lng FROM geo 
INNER JOIN 
(
     SELECT uid, utime, lat, lng... FROM ... INNER JOIN .. 
) ss
WHERE user = ss.uid AND time < ss.utime
ORDER BY time DESC LIMIT 1.
...
Рейтинг: 0 / 0
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
    #38546870
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
апдейт: забыл самое главное
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select * from 
(
   SELECT lat, lng, row_number () over (partition by user order by time desc) Rn
   FROM geo 
   INNER JOIN 
   (
       SELECT uid, utime, lat, lng... FROM ... INNER JOIN .. 
   ) ss
   WHERE user = ss.uid AND time < ss.utime
) a
WHERE a.Rn = 1
...
Рейтинг: 0 / 0
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
    #38547007
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или можно в select-листе указать, так как зависимый подзапрос возвращает не более одной строки из-за наличия limit 1

Код: sql
1.
2.
3.
4.
select t.*
  , (select (a, b) from t2 wher t2.t_id = t.id order by ... limit 1) as q
  from t
where ...
...
Рейтинг: 0 / 0
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
    #38547015
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Durakнакой тут латералы?
латералы - это добро. :) и, субъективно, воспринимаются легче.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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