Topic: Выборка из нескольких таблиц по нескольким критериям

Помогите начинающему, уже всю голову сломал.
Есть 2 таблицы, независимые друг от друга, но связанные по одному параметру с третьей таблицей.
т.е. X.id_Z = Z.id  и Y.id_Z = Z.id/

Нужно свести данные из этих 2 таблиц в одну и выбрать строки с максимальными id из каждой таблицы (одновременно) для каждого элемента из таблицы Z. Проще всего было бы объеденить эти таблицы через RIGHT JOIN от таблицы Z, но... в SQLite он не работает.

Наиболее близки результат даёт вот это:

SELECT Z.Z,
              .....,
              .....,
              MAX(Y.id),
              MAX(X.id)
FROM X, Y

LEFT OUTER JOIN Z ON X.id_Z = Z.id

WHERE X.id_Z= Y.id_Z

GROUP BY Z.id

Для полей X.id и Y.id всё срабатывает как надо, но вот для остальных полей данные подтаскиваются из совершенно левых строк, а не из соответствующих условию.

Если перенести выборку максимальных значений в WHERE, то правильно срабатывает только для первого значения из таблицы Z, для остальных берётся первая попавшаяся строка.

Как уже ни крутил, даже через временные таблицы пробовал - нужного результата не добился.
Может у кого идеи есть.

Re: Выборка из нескольких таблиц по нескольким критериям

идея такая:

select *
from z
left join x on  x.id = (select max(x2.id) from x as x2 where x2.id_z = z.id )
left join y on  y.id = (select max(y2.id) from y as y2 where y2.id_z = z.id )
Визуальное программирование: блог и телеграм-канал.

Re: Выборка из нескольких таблиц по нескольким критериям

Сори


неправильно условие прочитал
вот так без MAX

select *
from z
Where z.id in ((select id_z FROM x ORDER BY id DESC LIMIT 1), (select id_z FROM y ORDER BY id DESC LIMIT 1))


select *
from z, (select id_z FROM x ORDER BY id DESC LIMIT 1) x, (select id_z FROM y ORDER BY id DESC LIMIT 1) y
WHERE z.id = x.id_z or z.id = y.id_z

Re: Выборка из нескольких таблиц по нескольким критериям

Спасибо,  sparrow, тут есть над чем подумать, проверю.

Для К245 - к сожалению таблицы X и Y находятся СПРАВА, поэтому LEFT JOIN не проходит.

У таблицы Z слева ещё есть справочники, просто я не стал  усложнять вопрос :-)

5 (edited by netros 2023-12-06 14:42:20)

Re: Выборка из нескольких таблиц по нескольким критериям

Кстати, а зачем ещё загружать и таблицу Z?
Ведь те же данные есть в таблицах x и Y?
Ведь так вывод возрастёт ещё на порядок. (Ну до срабатывания WHERE)

Re: Выборка из нескольких таблиц по нескольким критериям

netros wrote:

...таблицы X и Y находятся СПРАВА, поэтому LEFT JOIN не проходит.

У таблицы Z слева ещё есть справочники, ...


Не совсем понятно о чем вы говорите.
Основную таблицу выборки вы выбираете сами так же как и соединение с другими таблицами,
исходя из того результата который вы хотите получить.

7 (edited by netros 2023-12-07 14:33:02)

Re: Выборка из нескольких таблиц по нескольким критериям

sparrow wrote:
netros wrote:

...таблицы X и Y находятся СПРАВА, поэтому LEFT JOIN не проходит.

У таблицы Z слева ещё есть справочники, ...


Не совсем понятно о чем вы говорите.
Основную таблицу выборки вы выбираете сами так же как и соединение с другими таблицами,
исходя из того результата который вы хотите получить.

Есть такой момент, возможно условный, таблицы, которые имеют связь с другой таблицей, считается, что они находятся справа от этой таблицы и подключаются оператором RIGHT JOIN. Т.е. одному значению таблицы СЛЕВА соответствует несколько значений из таблицы СПРАВА. Иерархия называется. Оператор LEFT JOIN подключает таблицы более верхнего уровня, а RIGHT JOIN -более низкого. Для примера: относительно таблицы НОМЕР
-
ТИП - Модель - (LEFT JOIN) - НОМЕР - (RIGHT JOIN) - ПЕРЕМЕЩЕНИЕ

8 (edited by netros 2023-12-07 14:56:49)

Re: Выборка из нескольких таблиц по нескольким критериям

Хотя сейчас начал понимать идею к245, но боюсь не сработает.
Даже задумался, не сделать ли всё на Acsess`e.

9 (edited by sparrow 2023-12-07 14:50:38)

Re: Выборка из нескольких таблиц по нескольким критериям

Спасибо.
А как на счет INNER ?


Ой догадался они без иерархии , они равнозначны. Правильно ?

Re: Выборка из нескольких таблиц по нескольким критериям

sparrow wrote:

Спасибо.
А как на счет INNER ?

INNER объединяет только те данные, которые есть в обеих таблицах, X и Y. В моём случае это не обязательно, поэтому эти данные выпадут из выборки, а они мне нужны. В этом случае сработал бы FULL JOIN, но его опять же нет. Но конструкция
SELECT *
FROM X,Y
на мой взгляд даёт почти тот же результат

11 (edited by netros 2023-12-07 14:59:56)

Re: Выборка из нескольких таблиц по нескольким критериям

sparrow wrote:

Спасибо.
А как на счет INNER ?


Ой догадался они без иерархии , они равнозначны. Правильно ?

Они в иерархии, но на одном уровне, просто как бы в разных ветках от Z

Re: Выборка из нескольких таблиц по нескольким критериям

Улыбнуло
Вокруг столько литературы, сайтов, примеров ...


Кстати вы привели пример CROSS JOIN даже не подозревая об этом.

Re: Выборка из нескольких таблиц по нескольким критериям

sparrow wrote:

Улыбнуло
Вокруг столько литературы, сайтов, примеров ...


Кстати вы привели пример CROSS JOIN даже не подозревая об этом.

Ну почему же не подозревая? :-)

Я за 2 недели чего только не прочитал, не перепробовал...

На мой взгляд дело не в очень корректной работе оператора GROUP BY в SQLite/

Просто не первый раз сталкиваюсь с тем, что оператор должен бы сработать одним образом (ну так пишут в книжках), а на выходе имеем немного не то.

Re: Выборка из нескольких таблиц по нескольким критериям

netros wrote:

Я за 2 недели чего только не прочитал, не перепробовал...

На мой взгляд дело не в очень корректной работе оператора GROUP BY в SQLite/

Просто не первый раз сталкиваюсь с тем, что оператор должен бы сработать одним образом (ну так пишут в книжках), а на выходе имеем немного не то.


Ну хватит... не смешите народ.
Кстати Microsoft, GOOGLE и другие гиганты не жалуются на работу GROUP BY в SQLite. Может не знают про проблемы.


при работе с аггрегатными функциями существуют определенные правила для столбцов в SELECT и GROUP BY.

15 (edited by netros 2023-12-08 17:22:12)

Re: Выборка из нескольких таблиц по нескольким критериям

sparrow wrote:
netros wrote:

Я за 2 недели чего только не прочитал, не перепробовал...

На мой взгляд дело не в очень корректной работе оператора GROUP BY в SQLite/

Просто не первый раз сталкиваюсь с тем, что оператор должен бы сработать одним образом (ну так пишут в книжках), а на выходе имеем немного не то.


Ну хватит... не смешите народ.
Кстати Microsoft, GOOGLE и другие гиганты не жалуются на работу GROUP BY в SQLite. Может не знают про проблемы.


при работе с аггрегатными функциями существуют определенные правила для столбцов в SELECT и GROUP BY.

Ну что тут сказать...

Не знаю как GOOGLE,  а вот  что Microsoft, Oracle, IBM  и другие гиганты не используют SQLite, а предпочитают свои базы данных - это факт.

И, кстати, на Acsess мне удалось добиться результата без особых проблем....

16 (edited by k245 2023-12-10 14:10:30)

Re: Выборка из нескольких таблиц по нескольким критериям

netros wrote:

Спасибо,  sparrow, тут есть над чем подумать, проверю.

Для К245 - к сожалению таблицы X и Y находятся СПРАВА, поэтому LEFT JOIN не проходит.

У таблицы Z слева ещё есть справочники, просто я не стал  усложнять вопрос :-)

Обожаю теоретиков - у них такие красивые, большие глаза, когда смотрят на результат практиков:

https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=10141&download=0

Post's attachments

Attachment icon изображение_2023-12-10_170956477.png 12.92 kb, 14 downloads since 2023-12-10 

Визуальное программирование: блог и телеграм-канал.

17 (edited by k245 2023-12-10 14:15:41)

Re: Выборка из нескольких таблиц по нескольким критериям

Поддерживаю sparrow, без max() будет быстрее работать:

select *
from z
left join x on  x.id = (select x2.id from x as x2 where x2.id_z = z.id order by 1 desc limit 1 )
left join y on  y.id = (select y2.id from y as y2 where y2.id_z = z.id order by 1 desc limit 1 )

https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=10142&download=0

Post's attachments

Attachment icon изображение_2023-12-10_171507897.png 12.45 kb, 13 downloads since 2023-12-10 

Визуальное программирование: блог и телеграм-канал.

Re: Выборка из нескольких таблиц по нескольким критериям

netros wrote:

Хотя сейчас начал понимать идею к245, но боюсь не сработает.
Даже задумался, не сделать ли всё на Acsess`e.

Страх порой лишает радости победы. Прислать свой проект или поверите на слово, что всё работает как надо?

Визуальное программирование: блог и телеграм-канал.

19 (edited by netros 2023-12-14 14:27:17)

Re: Выборка из нескольких таблиц по нескольким критериям

идею не бросил, вот до чего додумался, главное - работает:

SELECT z.z,
               a,
               b,
               c,
               d,
               MAX(id) as id

FROM (SELECT x.a as a,
                           x.b as b
                           y.c as c,
                           y.d as d,
                           x.z_id as z_id,
                           MAX(x.id),
                           y.id as id
             FROM x, y
             WHERE x.z_id=y.z_id
             GROUP BY x.z_id (можно y.z_id, один фиг),  y.id)

LEFT OUTER JOIN z ON z_id=Z.id

GROUP BY z.id

Re: Выборка из нескольких таблиц по нескольким критериям

k245 wrote:

идея такая:

select *
from z
left join x on  x.id = (select max(x2.id) from x as x2 where x2.id_z = z.id )
left join y on  y.id = (select max(y2.id) from y as y2 where y2.id_z = z.id )

Возможно, это какие-то тонкости языка SQL, которых я не постиг (напоминаю - я новичок)
Но из синтаксиса этого запроса x2, y2 - это какие-то временные таблицы (которые ещё непонятно как сформированы)
А из скрина следует, что это просто данные таблиц x и y. (Да из синтаксиса следует , в общем, то же самое)
Какой-то дуализм из квантовой физики

Re: Выборка из нескольких таблиц по нескольким критериям

Кроме того, пусть я ещё не постиг смысл конструкции x2.id и y2.id, но есть какое-то смутное ощущение, что я как-то до этого должен определить, что значение x2 является последним для линка z1, а  y2 - для линка z2.  Но если у нас появится (а оно появится) значение x5 для линка z1, или y5 для линка z2, то что, переделывать запрос?

Re: Выборка из нескольких таблиц по нескольким критериям

Читаем

select *
from z
left join x on  x.id = (select max(x2.id) from x as x2 where x2.id_z = z.id )
left join y on  y.id = (select max(y2.id) from y as y2 where y2.id_z = z.id )

и переводим на русский язык:

Выбрать все данные
из таблицы Z,
присоединив к каждой записи данные из таблицы X по правилу: значение Х.ID равно результату выборки подзапроса,
присоединив к каждой записи данные из таблицы Y по правилу: значение Y.ID равно результату выборки подзапроса.

Разбираем подзапрос

select max(x2.id) from x as x2 where x2.id_z = z.id

Выбрать максимальное значение из таблицы X, которую мы будем называть X2, при условии, что значение поля id_z равно значению поля id из таблицы Z


X2 - это алиас, чтобы не нарваться на коллизии имен полей, так как подзапрос использует ту же таблицу, что и основной запрос.

Визуальное программирование: блог и телеграм-канал.

Re: Выборка из нескольких таблиц по нескольким критериям

Просто сразу не въехал, что в подзапросе   именно таблица х определяется как алиас, можно же прочитать и так
(select max(x2.id) from x) as x2, но тогда всплывает рекурсия...