таблице по вот такому критерию
select my_tbl.*, their_tbl.id
from my_tbl left join their_tbl
on my_tbl.kassa_id = their_tbl.payment_system_id
or my_tbl.kassa_id = their_tbl.uuid
or my_tbl.req_id = their_tbl.uuid
or my_tbl.req_id = cast(their_tbl.id as varchar)
Таблицы достаточно большие и при всех условиях запрос просто зависает
Как можно решить такую потребность? Спасибо
переписать в стиле union
Эт понятно, а более изящних решений нет ?
Нормализовать обе таблицы под условия, тогда хотя бы возможен будет хэш джойн вместо безальтернативного картезиана...
пачку подзапросов + colesce можно попробовать
В вопросе не говорится что там взаимоисключающие нуллы
К чему ты хочешь применить coalesce?
я его видел, потому и спрашиваю...
Надо знать предметную область для более изящных условий) Если все поля могут быть заполнены как угодно , то изящных решений не видится(((
Как попало, все поля текстовые и с пусто и с нулд
Нужно найти 1.Есть в одной таблице нет в другой 2. Есть в другой нет в первой
Та это даже не left join🤦♀️
https://t.me/pgsql/303899
Ну, я же не буду прям полный спектр задачи просить )) Хотябы часть )
Ну, не хочешь -- не выноси, это ж тебе надо, а не нам.
Задача разовая или это будет частью частого периодического процесса?
Я очень уважаю Ярослава, но в данном случае, чем вам это поможет ? Просто для себя
Вообще это FOJ (full outer join) с фильтром по не сджойненным записям...
Да, я это прекрасно понимаю, но это только бы усложнило вопрос ((
Это не мне должно помочь (и не нам), а тебе.
Полуправда хуже лжи...
Ну, исходя из всей ситуации, union мне в помощь, даже при full outer
Теперь уже зная точно что требуется, можно уже точно сказать, что наиболее эффективным будет нормализовать через unpivot обе таблицы(например мвью) и использовать FOJ через hash join или sort merge join (в зависимости от реализации нопмализованных таблиц). Т.е. Сделать таблицы с полем типа possible_key который был бы анпивотом этих ключей джойна. И уже по ним джойнить
Зачем union при FOJ?
Ух, попробую завтра ))
Из практики, так быстрее реализовать, чем делать mv и прочие доп ddl и нормализации (
Так это как? Имеешь ввиду разбиение запроса на все варианты по одному предикату? Типа select from t1 left join t2 on t1.col1=t2.col1 union select from t1 left join t2 on t1.col1=t2.co2 union select from t1 left join t2 on t1.col1=t2.col3 union select from t1 left join t2 on t1.col2=t2.col1 union... `?
как вариант разбить на подзарпосы select my_tbl.*, their_tbl.id from my_tbl left join their_tbl on my_tbl.kassa_id in (their_tbl.payment_system_id ,their_tbl.uuid ) union select my_tbl.*, their_tbl.id from my_tbl left join their_tbl on my_tbl.req_id in ( their_tbl.uuid , cast(their_tbl.id as varchar) ) сделать индексы для my_tbl.kassa_id, their_tbl.uuid l, my_tbl.req_id
Обсуждают сегодня