|
|
|
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
|
|||
|---|---|---|---|
|
#18+
Есть некий запрос типа 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. И при этом в нём выдавать все возможные времена. А во внешнем запросе отсечь только нужное. Но может, можно проще? Модератор: Тема перенесена из форума "Проектирование БД". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 16:15:04 |
|
||
|
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
|
|||
|---|---|---|---|
|
#18+
Kirill Frolov, в 9.3 появилась новая конструкция LATERAL, как раз для таких случаев как у вас смотреть здесь и здесь В вашем случае скорее всего нужен запрос вида: Код: sql 1. 2. 3. 4. PS: проверьте наличие индекса в таблице geo по полям user и time ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 18:12:59 |
|
||
|
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
|
|||
|---|---|---|---|
|
#18+
Kirill Frolov, может можно и проще, но без юзабильного набора тестовых данных сильно сокращается число желающих помочь тебе в решении твоей проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 18:55:25 |
|
||
|
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
|
|||
|---|---|---|---|
|
#18+
AndreiSQL, человек все время упоминает о SQLite. Насколько я помню, там нет оператора LATERAL, как и во многих других СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 18:57:01 |
|
||
|
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
|
|||
|---|---|---|---|
|
#18+
Добрый Э - ЭхAndreiSQL, человек все время упоминает о SQLite. Насколько я помню, там нет оператора LATERAL, как и во многих других СУБД. тема заведена в форуме PostgreSQL, вот я и отвечаю как это в постре сделать ) В SQLite не силён, но вот здесь "Серж" утверждает, что в SQLite 3.2.5 все должно работать ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 19:58:43 |
|
||
|
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
|
|||
|---|---|---|---|
|
#18+
AndreiSQL, в том топике речь шла за коррелированные подзапросы вообще, но не про латеральную их модификацию. Латеральные подзапросы на сегодняшний день поддерживает MS SQL Server ([CROSS | OUTER] APPLY), Oracle (lateral join, и то только при включении определенного события - set event 22829 ), ну и PоstGre. Остальные СУБД пока нервно курят в сторонке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 20:13:27 |
|
||
|
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
|
|||
|---|---|---|---|
|
#18+
накой тут латералы? Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2014, 10:46:21 |
|
||
|
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
|
|||
|---|---|---|---|
|
#18+
апдейт: забыл самое главное Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2014, 10:48:39 |
|
||
|
Объединить два запроса в один, но вложенный запрос невозможен из-за JOIN.
|
|||
|---|---|---|---|
|
#18+
или можно в select-листе указать, так как зависимый подзапрос возвращает не более одной строки из-за наличия limit 1 Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2014, 12:24:08 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38547015&tid=1998867]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
148ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 191ms |
| total: | 430ms |

| 0 / 0 |
