172 похожих чатов

Всем привет, есть интересная задачка, мне нужно найти в другой

таблице по вот такому критерию
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)

Таблицы достаточно большие и при всех условиях запрос просто зависает

Как можно решить такую потребность? Спасибо

30 ответов

19 просмотров

переписать в стиле union

Chern-Oleksander Автор вопроса
Андрей Агеев
переписать в стиле union

Эт понятно, а более изящних решений нет ?

Chern Oleksander
Эт понятно, а более изящних решений нет ?

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

Chern Oleksander
Эт понятно, а более изящних решений нет ?

пачку подзапросов + colesce можно попробовать

Андрей Агеев
пачку подзапросов + colesce можно попробовать

В вопросе не говорится что там взаимоисключающие нуллы

Андрей Агеев
в каком вопросе?

К чему ты хочешь применить coalesce?

Андрей Агеев
см. запрос

я его видел, потому и спрашиваю...

Chern Oleksander
Эт понятно, а более изящних решений нет ?

Надо знать предметную область для более изящных условий) Если все поля могут быть заполнены как угодно , то изящных решений не видится(((

Chern-Oleksander Автор вопроса
Konstantin Zaitsev
Надо знать предметную область для более изящных ус...

Как попало, все поля текстовые и с пусто и с нулд

Chern-Oleksander Автор вопроса
xtender
В вопросе не говорится что там взаимоисключающие н...

Нужно найти 1.Есть в одной таблице нет в другой 2. Есть в другой нет в первой

https://t.me/pgsql/303899

Chern-Oleksander Автор вопроса
Konstantin Zaitsev
Та это даже не left join🤦‍♀️

Ну, я же не буду прям полный спектр задачи просить )) Хотябы часть )

Chern Oleksander
Ну, я же не буду прям полный спектр задачи просить...

Ну, не хочешь -- не выноси, это ж тебе надо, а не нам.

Chern Oleksander
Ну, я же не буду прям полный спектр задачи просить...

Задача разовая или это будет частью частого периодического процесса?

Chern-Oleksander Автор вопроса
Ilya Anfimov
Ну, не хочешь -- не выноси, это ж тебе надо, а не ...

Я очень уважаю Ярослава, но в данном случае, чем вам это поможет ? Просто для себя

Chern Oleksander
Нужно найти 1.Есть в одной таблице нет в другой 2...

Вообще это FOJ (full outer join) с фильтром по не сджойненным записям...

Chern-Oleksander Автор вопроса
xtender
Вообще это FOJ (full outer join) с фильтром по не ...

Да, я это прекрасно понимаю, но это только бы усложнило вопрос ((

Chern Oleksander
Я очень уважаю Ярослава, но в данном случае, чем в...

Это не мне должно помочь (и не нам), а тебе.

Chern-Oleksander Автор вопроса
xtender
Полуправда хуже лжи...

Ну, исходя из всей ситуации, union мне в помощь, даже при full outer

Chern Oleksander
Да, я это прекрасно понимаю, но это только бы усло...

Теперь уже зная точно что требуется, можно уже точно сказать, что наиболее эффективным будет нормализовать через unpivot обе таблицы(например мвью) и использовать FOJ через hash join или sort merge join (в зависимости от реализации нопмализованных таблиц). Т.е. Сделать таблицы с полем типа possible_key который был бы анпивотом этих ключей джойна. И уже по ним джойнить

Chern-Oleksander Автор вопроса
xtender
Зачем union при FOJ?

Из практики, так быстрее реализовать, чем делать mv и прочие доп ddl и нормализации (

Chern Oleksander
Из практики, так быстрее реализовать, чем делать m...

Так это как? Имеешь ввиду разбиение запроса на все варианты по одному предикату? Типа 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

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта